首页 > 解决方案 > 按下后退按钮时,颤动的 PageView 页面索引不会持续存在

问题描述

我的home.dart文件中有一个 PageView,并且希望每当用户home.dart从另一个页面导航回文件时,选择的索引保持不变。目前,首页索引为ImageFeedPage. 如果有人要转到ChatPage,打开其中一个对话,然后按后退按钮,他们将被带回第一个索引,即ImageFeedPage,而不是ChatPage

关于如何更正此问题以使所选索引在导航回时仍处于选中状态的任何想法?

主页.dart

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(),
      ),
    );
  }

聊天页面.dart

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',
        ),
      ],
    );
  }
}

标签: flutterdart

解决方案


推荐阅读