Flutter 按“后退”按钮时页面浏览页面索引不保持

Flutter 按“后退”按钮时页面浏览页面索引不保持,flutter,dart,Flutter,Dart,我的home.dart文件中有一个页面视图,每当用户从另一个页面导航回home.dart文件时,我希望所选索引保持不变。目前,第一个页面索引是ImageFeedPage。如果有人要转到聊天页面,打开其中一个对话,然后按后退按钮,他们将返回到第一个索引,即图像反馈页面,而不是聊天页面 有没有想过如何纠正这一点,以便在导航回时,所选索引仍处于选中状态 霍姆·达特 class Home extends StatefulWidget { @override _HomeState createSt

我的
home.dart
文件中有一个页面视图,每当用户从另一个页面导航回
home.dart
文件时,我希望所选索引保持不变。目前,第一个页面索引是
ImageFeedPage
。如果有人要转到
聊天页面
,打开其中一个对话,然后按后退按钮,他们将返回到第一个索引,即
图像反馈页面
,而不是
聊天页面

有没有想过如何纠正这一点,以便在导航回时,所选索引仍处于选中状态

霍姆·达特

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  PageController pageController;
  int pageIndex = 0;

  @override
  void initState() {
    super.initState();
    pageController = PageController();
  }

  @override
  void dispose() {
    pageController.dispose();

    super.dispose();
  }

  onPageChanged(int pageIndex) {
    if (pageIndex != 1 && pageIndex != 2) {
      setState(() {
        this.pageIndex = pageIndex;
      });
    }
  }

  onTap(int pageIndex, User user) {
    if (pageIndex == 1) {
      SearchPage.show(context);
    } else if (pageIndex == 2) {
      AddProductPage.show(context);
    } else {
      pageController.jumpToPage(pageIndex);
    }
  }

  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);

    return Scaffold(
      body: PageView(
        children: <Widget>[
          ImageFeedPage(),
          new Container(),
          new Container(),
          ClosetPage(),
          ChatPage(),
        ],
        controller: pageController,
        onPageChanged: onPageChanged,
        physics: NeverScrollableScrollPhysics(),
      ),
      bottomNavigationBar: CupertinoTabBar(
        backgroundColor: Colors.white,
        currentIndex: pageIndex,
        onTap: (pageIndex) => onTap(pageIndex, user),
        activeColor: Theme.of(context).primaryColor,
        items: _buildMenuItems(),
      ),
    );
  }
class Home扩展StatefulWidget{
@凌驾
_HomeState createState()=>\u HomeState();
}
类(HomeState扩展状态){
页面控制器;
int pageIndex=0;
@凌驾
void initState(){
super.initState();
pageController=pageController();
}
@凌驾
无效处置(){
pageController.dispose();
super.dispose();
}
onPageChanged(int-pageIndex){
如果(pageIndex!=1&&pageIndex!=2){
设置状态(){
this.pageIndex=pageIndex;
});
}
}
onTap(int-pageIndex,用户){
如果(pageIndex==1){
SearchPage.show(上下文);
}else if(pageIndex==2){
AddProductPage.show(上下文);
}否则{
pageController.jumpToPage(页面索引);
}
}
@凌驾
小部件构建(构建上下文){
最终用户=提供者(上下文);
返回脚手架(
正文:页面视图(
儿童:[
ImageFeedPage(),
新容器(),
新容器(),
ClosetPage(),
ChatPage(),
],
控制器:页面控制器,
onPageChanged:onPageChanged,
物理学:NeverscrollableScroll物理学(),
),
底部导航栏:CupertinoTabBar(
背景颜色:Colors.white,
currentIndex:pageIndex,
onTap:(页面索引)=>onTap(页面索引,用户),
activeColor:Theme.of(context.primaryColor),
项目:_buildMenuItems(),
),
);
}
飞镖

class ChatPage extends StatefulWidget {
  @override
  _ChatPageState createState() => _ChatPageState();
}

class _ChatPageState extends State<ChatPage> {
  final Widget pageTitle = Text('Active Chats');

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
        // Need to use CustomAppBar
        appBar: new AppBar(
          backgroundColor: new Color(0xfff8faf8),
          centerTitle: true,
          elevation: 1.0,
          title: pageTitle,
          bottom: new CustomTabBar(
            tabs: <Tab>[
              new Tab(text: 'As Buyer'),
              new Tab(text: 'As Seller'),
            ],
          ),
        ),
        drawer: Sidebar(),
        body: _buildTabView(context),
      ),
    );
  }

  Widget _buildTabView(context) {
    return new TabBarView(
      children: <Widget>[
        new ListTile(
          title: new Text(
            'John',
            style: TextStyle(
              fontWeight: FontWeight.bold,
            ),
          ),
          onTap: () {
            return MessagesPage.show(context); <--- Goes to the message page, but pressing back (once opened) takes you to the first index of the PageView, not the ChatPage
          },
        ),
        ChatList(
          messageType: 'seller',
        ),
      ],
    );
  }
}
class ChatPage扩展StatefulWidget{
@凌驾
_ChatPageState createState()=>\u ChatPageState();
}
类_ChatPageState扩展状态{
final Widget pageTitle=文本(“活动聊天”);
@凌驾
小部件构建(构建上下文){
返回DefaultTabController(
长度:2,
孩子:脚手架(
//需要使用CustomAppBar吗
appBar:新的appBar(
背景色:新颜色(0xfff8faf8),
标题:对,
标高:1.0,
标题:pageTitle,
底部:新CustomTabBar(
选项卡:[
新选项卡(文本:“作为买方”),
新选项卡(文本:“作为卖方”),
],
),
),
抽屉:侧边栏(),
正文:_buildTabView(上下文),
),
);
}
小部件构建选项卡视图(上下文){
返回新选项卡视图(
儿童:[
新ListTile(
标题:新文本(
“约翰”,
样式:TextStyle(
fontWeight:fontWeight.bold,
),
),
onTap:(){

返回MessagesPage.show(上下文);您可以做的一件事是将索引存储在
onPageChange
(或类似名称)的共享首选项中并在打开页面查看页面或其他任何页面时检查并分配该值。@Blasanka您介意提供一些代码作为示例吗?不太确定我是否理解您的意思。谢谢您的回答。在我的应用程序中,我使用了BlocBuilder,它自动为我完成了这项工作,请尝试本教程了解如何使用它,它不会向您展示如何使用per列出索引,但将其实现到UI中就足以将其持久化