Как сбросить настройки навигатора при переключении между вкладками купертино
Я пытаюсь настроить многостраничное приложение во Flutter, где нижняя вкладка содержит четыре наиболее часто используемых страницы, включая кнопку "Дополнительно". Чем больше кнопка показывает страницу со ссылками на другие страницы. При нажатии на страницу я хочу, чтобы эта страница заменила страницу "Дополнительно", чтобы был создан новый стек навигации. Однако при переключении на другую вкладку и затем обратно на вкладку "больше" состояние навигации запоминается. Это означает, что я не вижу страницу "Дополнительно", а страницу, которую я оставил при переключении вкладок. Я хочу показывать страницу "Больше" каждый раз, когда пользователь нажимает на вкладку "Еще".
Я пытался использовать метод pushReplacement в Navigator, поэтому, когда пользователь нажимает на дополнительную страницу, он не может вернуться к списку дополнительных страниц. Тем не менее, при переключении вкладок страница больше больше никогда не отображается, потому что она заменена.
Я также попытался настроить метод обратного вызова для вкладки, чтобы отобразить все представления и вернуть навигатор на экран "Больше". Однако это оставило меня с ошибкой в консоли: setState() or markNeedsBuild() called during build.
,
Экран вкладки:
class TabScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return TabScreenState();
}
}
class TabScreenState extends State<TabScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: WillPopScope(
// Prevent swipe popping of this page. Use explicit exit buttons only.
onWillPop: () => Future<bool>.value(true),
child: CupertinoTabScaffold(
tabBar: CupertinoTabBar(
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text('Artikelen'),
),
BottomNavigationBarItem(
icon: Icon(Icons.message),
title: Text('Activiteiten'),
),
BottomNavigationBarItem(
icon: Icon(Icons.speaker_group),
title: Text('Training'),
),
BottomNavigationBarItem(
icon: Icon(Icons.more),
title: Text('Meer'),
),
],
),
tabBuilder: (BuildContext context, int index) {
assert(index >= 0 && index <= 3);
switch (index) {
case 0:
return CupertinoTabView(
builder: (BuildContext context) {
Navigator.of(context).popUntil((route) => route.isFirst);
return ArticleListScreen();
},
defaultTitle: 'Artikelen',
);
break;
case 1:
return CupertinoTabView(
builder: (BuildContext context) => ActivityListScreen(),
defaultTitle: 'Activiteiten',
);
break;
case 2:
return CupertinoTabView(
builder: (BuildContext context) => ArticleListScreen(),
defaultTitle: 'Training',
);
break;
case 3:
return CupertinoTabView(
builder: (BuildContext context) {
Navigator.of(context).popUntil((route) => route.isFirst);
return MoreScreen();
},
defaultTitle: 'Meer',
);
break;
}
return null;
},
),
),
);
}
}
И еще экран, на котором есть кнопка для перехода на другую страницу:
class MoreScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return MoreScreenState();
}
}
class MoreScreenState extends State<MoreScreen> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
color: ThemeData.dark().accentColor,
alignment: AlignmentDirectional(0.0, 0.0),
child: MaterialButton(
child: Text('PUSH page'),
onPressed: () => {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => ArticleListScreen()))
},
)
),
);
}
}
Я ожидаю, что стек навигации будет сбрасываться при каждом переключении вкладок, но теперь я должен сделать это вручную, используя:
Navigator.of(context).popUntil((route) => route.isFirst);
Это приводит к сообщению об ошибке: setState() or markNeedsBuild() called during build.
после нажатия новой страницы на вкладке, а затем переключения вкладок.