Flutter 開発は初めてです。また、ボトム ナビゲーション バーを理解するために、複数のチュートリアルを行ってきました。
これらのチュートリアルを試しましたが、必要な要件を満たすことができません。私が従ったチュートリアル:
- https://codewithandrea.com/articles/multiple-navigators-bottom-navigation-bar/
- https://medium.com/flutter/getting-to-the-bottom-of-navigation-in-flutter-b3e440b9386
- https://medium.com/@theboringdeveloper/common-bottom-navigation-bar-flutter-e3693305d2d
ネストされたルートがあるので、個人的には最初のチュートリアルが好きでした。
情報:
ホーム、カレンダー、プロフィールの 3 つのタブがあるボトム ナビゲーションがあります。
ホームタブにはスクリーンがあります: Screen2。カレンダーにはスクリーンがあります: Screen3。プロファイルにはスクリーンがあります: Screen4
問題:
画面の状態を保持する下部のナビゲーション バー (これは良いことです)。
ホーム画面には、 Screen2を開くボタンがあります。ユーザーがクリックすると、Screen2 がプッシュされます。ユーザーがカレンダー (タブ) をクリックすると、カレンダー画面が表示されます。ここで、ユーザーが再度ホーム ボタン (タブ) をクリックすると、ユーザーに Screen2 が表示されます。そのルート(ホーム)の一部だったからです。ホーム画面のみを表示する場所。
そして、私はそれをリセットしたいだけです。基本的に、ホーム画面はホーム画面をプッシュし、ホーム ページのすべての子をポップする必要があります。タブ切り替え時。
コード:
main.dart
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MainScreen(),
);
}
}
main_screen.dart
class MainScreen extends StatefulWidget {
MainScreen({Key key}) : super(key: key);
@override
_MainScreenState createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
int _selectedIndex = 0;
List<GlobalKey<NavigatorState>> _navigatorKeys = [
GlobalKey<NavigatorState>(),
GlobalKey<NavigatorState>(),
GlobalKey<NavigatorState>()
];
List<Widget> _widgetOptions = <Widget>[
HomePage(),
CalendarPage(),
ProfilePage(),
];
Map<String, WidgetBuilder> _routeBuilders(BuildContext context, int index) {
return {
'/': (context) {
return [
HomePage(),
CalendarPage(),
ProfilePage(),
].elementAt(index);
},
};
}
Widget _buildOffstageNavigator(int index) {
var routeBuilders = _routeBuilders(context, index);
return Offstage(
offstage: _selectedIndex != index,
child: Navigator(
key: _navigatorKeys[index],
onGenerateRoute: (routeSettings) {
return MaterialPageRoute(
builder: (context) => routeBuilders[routeSettings.name](context),
);
},
),
);
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
final isFirstRouteInCurrentTab =
!await _navigatorKeys[_selectedIndex].currentState.maybePop();
// let system handle back button if we're on the first route
return isFirstRouteInCurrentTab;
},
child: Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
child: Stack(
children: [
_buildOffstageNavigator(0),
_buildOffstageNavigator(1),
_buildOffstageNavigator(2),
],
),
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _selectedIndex,
showSelectedLabels: false,
showUnselectedLabels: false,
items: [
BottomNavigationBarItem(
icon: Icon(
Feather.home,
color: Colors.grey[300],
),
label: 'HOME',
activeIcon: Icon(
Feather.home,
color: Colors.purple[300],
),
),
BottomNavigationBarItem(
icon: Icon(
FontAwesome.calendar,
color: Colors.grey[300],
),
label: 'CALENDAR',
activeIcon: Icon(
FontAwesome.calendar,
color: Colors.purple[300],
),
),
BottomNavigationBarItem(
icon: Icon(
EvilIcons.user,
color: Colors.grey[300],
size: 36,
),
label: 'PROFILE',
activeIcon: Icon(
EvilIcons.user,
color: Colors.purple[300],
size: 36,
),
),
],
onTap: (index) {
setState(() {
_selectedIndex = index;
});
},
),
),
);
}
}
home_page.dart
class HomePage extends StatefulWidget {
HomePage();
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.lightBlueAccent,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Container(
child: Text(
'Screen 1',
style: TextStyle(color: Colors.white, fontSize: 20),
),
margin: EdgeInsets.all(16),
),
FlatButton(
onPressed: () {
// Navigator.push(context, MaterialPageRoute(
// builder: (context) => Screen2()
// ));
Navigator.push(context, PageRouteBuilder(pageBuilder: (_,__,___) => Screen2()));
},
child: Text('Go to next screen'),
color: Colors.white,
),
],
));
}
}
calendar_page.dart
class CalendarPage extends StatefulWidget {
CalendarPage({Key key}) : super(key: key);
@override
_CalendarPageState createState() => _CalendarPageState();
}
class _CalendarPageState extends State<CalendarPage> {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.red,
child: Center(
child: FlatButton(
onPressed: (){
Navigator.push(context, MaterialPageRoute(
builder: (context) => Screen3()
));
},
child: Text('Go to next screen'),
color: Colors.white,
),
),
);
}
}
誰かが私を方向に向けることができれば、本当に感謝しています。前もって感謝します。
要件: タブがあり、各タブはそれぞれの画面 (ScreenX-> ScreenY-> ScreenN) になります。タブが切り替えられると、タブのすべての子がポップされます。これが理解できることを願っています(申し訳ありませんが、私の英語は苦手です)。
ここで何が欠けていますか?