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();
}
},
);
}