fix(ui): scroll the germination & condition-check sheets; extend overflow guard

Two save-button sheets wrapped their body in a bare Column (no scroll): the
germination sheet (which grows a list of past tests) and the condition-check
sheet. On a small phone — especially with the keyboard up — the Save button
was pushed off the bottom, unreachable. Both now wrap the body in a
SingleChildScrollView, like the other input sheets already do.

Also extends the small-phone overflow guard to the profile (identity card +
Save), about, intro carousel, and the market/chat screens in their offline
'set up sharing' state. 17 cases green at 320x568 across es/pt/ast.
This commit is contained in:
vjrj 2026-07-11 01:11:12 +02:00
parent d89ee64bc7
commit 68ffb55f47
2 changed files with 77 additions and 16 deletions

View file

@ -10,9 +10,11 @@ import 'package:tane/services/social_connection.dart';
import 'package:tane/services/social_service.dart';
import 'package:tane/services/social_settings.dart';
import 'package:tane/ui/about_screen.dart';
import 'package:tane/ui/chat_screen.dart';
import 'package:tane/ui/home_screen.dart';
import 'package:tane/ui/intro_screen.dart';
import 'package:tane/ui/inventory_list_screen.dart';
import 'package:tane/ui/market_screen.dart';
import 'package:tane/ui/profile_screen.dart';
import 'package:tane/ui/settings_screen.dart';
@ -139,6 +141,61 @@ void main() {
await disposeTree(tester);
});
// The market/chat are "live" screens; checked here in their OFFLINE state
// (the shared connection can't reach a relay) — a static layout, and the one
// a user without signal actually sees.
Future<SocialConnection> offlineConn() async {
final social = await SocialService.fromRootSeedHex('00' * 32);
final settings = SocialSettings(InMemorySecretStore());
await settings.setRelayUrls(const []);
return SocialConnection(
social: social,
settings: settings,
open: (_) async => throw StateError('offline'),
online: const Stream.empty(),
);
}
testWidgets('market (offline "set up sharing") fits a small screen',
(tester) async {
final db = newTestDatabase();
addTearDown(db.close);
final connection = await offlineConn();
await pumpSmall(
tester,
wrapScreen(
repository: newTestRepository(db),
locale: AppLocale.es,
child: MarketScreen(
social: await SocialService.fromRootSeedHex('00' * 32),
settings: SocialSettings(InMemorySecretStore()),
connection: connection,
),
),
);
await disposeTree(tester);
});
testWidgets('chat (offline "set up sharing") fits a small screen',
(tester) async {
final db = newTestDatabase();
addTearDown(db.close);
final connection = await offlineConn();
await pumpSmall(
tester,
wrapScreen(
repository: newTestRepository(db),
locale: AppLocale.es,
child: ChatScreen(
social: await SocialService.fromRootSeedHex('00' * 32),
connection: connection,
peerPubkey: 'ab' * 32,
),
),
);
await disposeTree(tester);
});
testWidgets('inventory (empty) fits a small screen', (tester) async {
final db = newTestDatabase();
addTearDown(db.close);