У меня есть вложенный BottomNavigationBar
, который позволяет мне создавать стек внутри каждого элемента. Это позволяет мне вернуться к исходной странице в стеке. Но после перехода на другую страницу appBar
дублируется. Если я удалю исходный appBar
, я останусь без appBar
на целевой странице. Если я удалю пункт назначения appBar
, я потеряю стрелку, чтобы вернуться назад.
Так что я думаю, что мне следует попробовать;
- Программно удалить первый
appBar
, когда нажав на целевую страницу, - Удалите адрес назначения
appBar
и каким-то образом получите исходный appBar
, чтобы унаследовать поведение пункта назначения appBar
.
Являются одним из этих подходит толковое? Если да, то как лучше всего это сделать? Или мне следует использовать совершенно другой подход? Есть ли способ иметь как постоянные BottomnavigationBar
, так и appBar
?
Вот основной код, содержащий вложенные BottomNavigationBar
;
class TabsScreen extends StatefulWidget {
@override
_TabsScreenState createState() => _TabsScreenState();
}
class _TabsScreenState extends State<TabsScreen> {
int _currentIndex = 0;
final _home = GlobalKey<NavigatorState>();
final _messages = GlobalKey<NavigatorState>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
//some stuff
),
body: IndexedStack(
index: _currentIndex,
children: <Widget>[
Navigator(
key: _home,
onGenerateRoute: (route) => MaterialPageRoute(
settings: route,
builder: (context) => MainPage(),
),
),
Navigator(
key: _messages,
onGenerateRoute: (route) => MaterialPageRoute(
settings: route,
builder: (context) => Messages(),
),
),
),
],
),
bottomNavigationBar: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
currentIndex: _currentIndex,
onTap: (val) => _onTap(val, context),
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text('Home'),
),
BottomNavigationBarItem(
icon: Icon(Icons.message),
title: Text('Messages'),
),
],
),
);
}
void _onTap(int val, BuildContext context) {
if (_currentIndex == val) {
switch (val) {
case 0:
_home.currentState.popUntil((route) => route.isFirst);
break;
case 1:
_messages.currentState.popUntil((route) => route.isFirst);
break;
default:
}
} else {
if (mounted) {
setState(() {
_currentIndex = val;
});
}
}
}
}
Вот код, который подталкивает к страница назначения;
onSwipeUp: () {
Navigator.push(
context,
PageTransition(
type: PageTransitionType.downToUp,
child: HomeReply(),
)
);
},
А вот код назначения:
class HomeReply extends StatefulWidget {
@override
_HomeReplyState createState() => new _HomeReplyState();
}
class _HomeReplyState extends State<HomeReply> {
@override
void initState(){}
@override
Widget build(BuildContext context) {
return
Scaffold(
appBar: AppBar(
title: Text(
"Back to " + "'" + originalTitle + "'",
),
),
body: ReplyStage(),
);
}
}