【问题标题】:Flutter - Trigger PageView change on Provider value changeFlutter - 在提供者值更改时触发 PageView 更改
【发布时间】:2020-09-08 02:33:13
【问题描述】:

我有一个带有 PageView 页面的自定义 BottomAppBar。当用户单击 BottomAppBar 中的项目时,我正在尝试更改页面。我正在使用 Provider 来管理全局状态。单击项目会触发提供程序中的值更改,但 PageView 中没有方法可以在值更改时触发页面更改。我怎样才能做到这一点?下面是我的代码。

我的提供者:

class CurrentPage extends ChangeNotifier {
  int _currentPage = 0;
  int get currentPage => _currentPage;

  setCurrentPage(int val) {
    _currentPage = val;
    notifyListeners();
  }
}

BottomAppBar 项:

 InkWell(
                onTap: () {
                  context.read<CurrentPage>().setCurrentPage(0);
                },
                child: Padding(
                  padding: const EdgeInsets.symmetric(
                      horizontal: 26.5, vertical: 17.0),
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    children: <Widget>[
                      Icon(
                        CustomIcons.home,
                        size: 18.0,
                        color: context.watch<CurrentPage>().currentPage == 0
                            ? Color(0xFF2C1DEB)
                            : Color(0xFFCCCCD5),
                      ),
                      SizedBox(height: 9.0),
                      Text(
                        'HOME',
                        style: TextStyle(
                          color: context.watch<CurrentPage>().currentPage == 0
                              ? Color(0xFF2C1DEB)
                              : Color(0xFFCCCCD5),
                          fontWeight: FontWeight.w800,
                          fontSize: 10.0,
                          letterSpacing: 1.0,
                        ),
                      ),
                    ],
                  ),
                ),
              ),

页面视图:

class Pages extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final PageController _pageController =
        PageController(initialPage: context.watch<CurrentPage>().currentPage);

    return PageView(
      onPageChanged: (int) {},
      controller: _pageController,
      scrollDirection: Axis.horizontal,
      pageSnapping: true,
      children: [
        Container(
          color: Colors.green,
          child: Text('Home Page'),
        ),
        Container(
          child: Text('Profile Page'),
        ),
        Container(
          child: Text('Search Page'),
        ),
        Container(
          child: Text('Jobs Page'),
        ),
      ],
    );
  }
}

【问题讨论】:

    标签: flutter flutter-provider flutter-pageview


    【解决方案1】:

    这是你可以做到的。一旦您从您的提供商处调用notifyListener,如果currentPage 已更改,这将转到新选择的页面

    class Pages extends StatelessWidget {
          final PageController _pageController =
                PageController(initialPage:0);
          @override
          Widget build(BuildContext context) {
    
    
        return Consumer<CurrentPage>(builder:(ctx, currentPage,  widget){
    
         final pageView = PageView(
              onPageChanged: (int) {},
              controller: _pageController,
              scrollDirection: Axis.horizontal,
              pageSnapping: true,
              children: [
                Container(
                  color: Colors.green,
                  child: Text('Home Page'),
                ),
                Container(
                  child: Text('Profile Page'),
                ),
                Container(
                  child: Text('Search Page'),
                ),
                Container(
                  child: Text('Jobs Page'),
                ),
              ],);
              if(currentPage.currentPage != _pageController.page.floor()){
                _pageController.jumpToPage(currentPage.currentPage);
              }
              return pageView;
              }
            );
          }
        }
    

    【讨论】:

    • 谢谢哥们。但是在构建页面视图之前无法访问 PageController.page 。出现以下错误:PageController.page 在构建 PageView 之前无法访问。
    • 你好萨德。我已经更新了我的答案。请看一下
    • 就是这样。非常感谢朋友
    • 我在类似情况下需要帮助.. 有人可以看看这个吗?在此先感谢...stackoverflow.com/questions/67923192/…
    【解决方案2】:

    您应该在 PageViewController 中使用 animateToPagejumpToPage 方法。你还需要让你的页面小部件 StatefullWidget。

    【讨论】:

    • 但是我怎样才能触发提供程序中的值更改而不是点击按钮?
    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2021-01-26
    • 2015-01-23
    • 2012-09-06
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多