Render startup immediately and defer native work with a smooth home transition

This commit is contained in:
Codex
2026-10-14 17:26:24 +08:00
parent bb7a7a2e58
commit ce21cdc10c
17 changed files with 641 additions and 144 deletions
@@ -0,0 +1,58 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
import 'package:hepan_everyday/features/school/school_session.dart';
import 'package:hepan_everyday/domain/school_term.dart';
import '../support/fake_school_web.dart';
class CountingSchoolPlatform extends FakeSchoolPlatform {
int creations = 0;
@override
PlatformWebViewController createPlatformWebViewController(
PlatformWebViewControllerCreationParams params,
) {
creations++;
return super.createPlatformWebViewController(params);
}
}
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
test('local timetable startup does not construct the school browser', () {
final platform = CountingSchoolPlatform();
WebViewPlatform.instance = platform;
final session = SchoolSession();
try {
expect(platform.creations, 0);
expect(session.connectionState, SchoolConnectionState.signedOut);
expect(session.hasOpened, isFalse);
} finally {
session.dispose();
}
});
test(
'opening school creates one reusable browser with navigation policy',
() async {
final platform = CountingSchoolPlatform();
WebViewPlatform.instance = platform;
final session = SchoolSession();
try {
await session.openTimetable(term: SchoolTerm(73));
expect(platform.creations, 1);
final controller = session.web;
expect(session.web, same(controller));
expect(platform.creations, 1);
expect(platform.web.loads, isNotEmpty);
final decision = await platform.delegate.navigation(
NavigationRequest(
url: 'https://unrelated.example/',
isMainFrame: true,
),
);
expect(decision, NavigationDecision.prevent);
} finally {
session.dispose();
}
},
);
}
@@ -66,9 +66,12 @@ void main() {
WebViewPlatform.instance = platform;
final session = SchoolSession();
addTearDown(session.dispose);
// A previously authenticated session has already opened its browser.
final connectedBrowser = session.web;
session.connectionState = SchoolConnectionState.connected;
await session.openTimetable(term: SchoolTerm(72), chooseTerm: true);
expect(session.needsTermSelection, isTrue);
expect(session.web, same(connectedBrowser));
expect(platform.web.loads, isEmpty);
expect(session.selectedTerm, SchoolTerm(72));
expect(session.pendingDraft, isNull);