问题描述
在应用程序中,我使用 PageView
作为主页,其中包含 3 个页面 - 配置文件、控制台、带有 AutomaticKeepAliveClientMixin
扩展名的设置。其中,2 个页面(配置文件和控制台)有一个“侧菜单”屏幕,再次使用 PageView
。
问题是当我在主页之间切换时,我希望如果“侧菜单”在任何页面上打开,它(第二个PageView
)应该跳转到初始页面。
这是代码的简化版本-
材料应用-
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Home();
);
}
}
主页小部件 -
class Home extends StatefulWidget {
Home({Key key}) : super(key: key);
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int _selectedIndex = 0;
final pageController = PageController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: PageView(
controller: pageController,physics: PageScrollPhysics(
parent: ScrollPhysics(
parent: NeverScrollableScrollPhysics())),children: <Widget>[
Tab1(),Tab2(),Tab3(),],),//to set the bottom navigation bar and not reset the entire tree
bottomNavigationBar: StatefulBuilder(
builder: (BuildContext context,setState) {
return BottomNavigationBar(
currentIndex: _selectedIndex,selectedItemColor: Colors.green[800],onTap: (index) {
setState(() {
_selectedIndex = index;
});
pageController.jumpToPage(index);
},items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.person),label: 'Profile'),BottomNavigationBarItem(
icon: Icon(Icons.connect_without_contact),label: 'Console'),BottomNavigationBarItem(
icon: Icon(Icons.settings),label: 'Settings')
],);
},);
}
}
相同的三页 -
class Tab1 extends StatefulWidget {
@override
_Tab1State createState() => _Tab1State();
}
class _Tab1State extends State<Tab1> with AutomaticKeepAliveClientMixin<Tab1> {
final controller = PageController();
//to use back button to go back to initial screen when poped
bool onWillPop() {
pageController.previousPage(
duration: Duration(milliseconds: 200),curve: Curves.linear,);
return false;
}
@override
get wantKeepAlive {
return true;
}
@override
Widget build(BuildContext context) {
super.build(context);
return PageView(
controller: controller,children: [
Scaffold(
appBar:
AppBar(title: Text('Profile'),backgroundColor: Colors.grey[200]),//so that back button brings user back to initial screen
WillPopScope(
onWillPop: () => Future.sync(onWillPop),child: Scaffold(
appBar: AppBar(
title: Text('Side Menu Screen'),)
],);
}
}
class Tab2 extends StatefulWidget {
@override
_Tab2State createState() => _Tab2State();
}
class _Tab2State extends State<Tab2> with AutomaticKeepAliveClientMixin<Tab2> {
final controller = PageController();
//to use back button to go back to initial screen when poped
bool onWillPop() {
pageController.previousPage(
duration: Duration(milliseconds: 200),children: [
Scaffold(
appBar:
AppBar(title: Text('Console'),);
}
}
class Tab3 extends StatefulWidget {
@override
_Tab3State createState() => _Tab3State();
}
class _Tab3State extends State<Tab3> with AutomaticKeepAliveClientMixin<Tab3> {
final controller = PageController();
//to use back button to go back to initial screen when poped
bool onWillPop() {
pageController.previousPage(
duration: Duration(milliseconds: 200),children: [
Scaffold(
appBar:
AppBar(title: Text('Settings'),);
}
}
可能的方法-
- 检测标签页或页面何时离开屏幕并调用
controller.jumpToPage()
方法。 (如果可能的话最好)
这样的东西-
@override
void dispose() {
if (controller.hasClients) {
controller.jumpToPage(controller.initialPage);
}
super.dispose();
}
- 通过
PageView
属性侦听第一个onPageChanged
中的更改。 - 检查是否推送后弹出
willPopScope
。
感谢您的帮助...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)