import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:miler/widget/Bottom_page.dart'; /// The shell keeps every tab alive in an `IndexedStack`: all four pages are /// built at launch and switching tabs only changes which one is painted. So a /// page that loads in `initState` shows whatever was true before the rider did /// anything — which is exactly how a completed stop failed to appear on /// Activity. Pages re-read when their index comes forward, so the notifier that /// tells them has to actually change. void main() { testWidgets('an IndexedStack builds every child up front', (tester) async { final built = []; Widget page(int i) => Builder(builder: (_) { built.add(i); return SizedBox(key: ValueKey('page$i')); }); await tester.pumpWidget( MaterialApp( home: IndexedStack(index: 0, children: [page(0), page(1), page(2)]), ), ); expect( built, containsAll([0, 1, 2]), reason: 'this is why initState cannot be a page\'s only load', ); }); test('the shell publishes the tab on screen', () { // Starts on Home and is a broadcast point a page can listen to. var heard = []; void listener() => heard.add(BottomPage.currentTab.value); BottomPage.currentTab.addListener(listener); addTearDown(() => BottomPage.currentTab.removeListener(listener)); BottomPage.currentTab.value = 2; BottomPage.currentTab.value = 1; expect(heard, [2, 1]); }); }