【问题标题】:Handle swipe of PageViewer Programmatically in TabBar - Flutter在 TabBar 中以编程方式处理 PageViewer 的滑动 - Flutter
【发布时间】:2021-10-19 22:37:16
【问题描述】:

我已经用 3 个标签实现了 TabBar。在第 2 个选项卡中,该类包含 PageViewer 及其 3 页。

现在当我从第一个标签滑动到第三个标签时,页面出现的顺序是这样的:

1st Tab >> 
2nd Tab(PageViewer index 0th page) > (index 1st page) > (index 2nd page) >> 
3rd Tab.

但是当我从 3rd Tab 滑动到 1st Tab 时,页面出现的顺序是这样的:

3rd Tab >>
2nd Tab(PageViewer index 0th page) >>
1st Tab.

当我从第 3 个标签转到第一个标签时,我想要的是:

3rd Tab >>
2nd Tab(PageViewer index 3rd page) > (index 2nd page) > (index 1st page) >>
1st Tab.

我正在寻找可以包含代码示例或手势处理的解决方案。

【问题讨论】:

    标签: flutter navigation gesture tabbar flutter-pageview


    【解决方案1】:

    您可以跟踪上一个标签索引。使用它来呈现页面浏览的初始页面。请参考以下代码示例。

    标签栏包含的小部件,

    class MyTabbedPage extends StatefulWidget {
      const MyTabbedPage({Key key}) : super(key: key);
      @override
      _MyTabbedPageState createState() => _MyTabbedPageState();
    }
    class _MyTabbedPageState extends State<MyTabbedPage> with SingleTickerProviderStateMixin {
      TabController _tabController;
      // keeps the track of tab index
      int _currentIndex = 0;
    
      @override
      void initState() {
        super.initState();
        _tabController = TabController(vsync: this, length: 3);
        _tabController.addListener(_handleTabSelection);
      }
    
      _handleTabSelection() {
        setState(() {
          if (_tabController.index != 1) _currentIndex = _tabController.index;
        });
      }
    
      @override
      void dispose() {
        _tabController?.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: Scaffold(
            appBar: AppBar(
              bottom: TabBar(
                controller: _tabController,
                tabs: [
                  Tab(text: 'Tab 1'),
                  Tab(text: 'Tab 2'),
                  Tab(text: 'Tab 3'),
                ],
              ),
              title: const Text('Tabs Demo'),
            ),
            body: TabBarView(
              controller: _tabController,
              children: [
                Center(child: Text('Tab 1')),
                SecondTab(tabIndex: _currentIndex),
                Center(child: Text('Tab 3')),
              ],
            ),
          ),
        );
      }
    }
    

    浏览量包括第二个标签小部件,

    class SecondTab extends StatelessWidget {
      final int tabIndex; // tab index, which came from
      SecondTab({Key key, @required this.tabIndex}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        // set initial page to first or last based on previous tab index
        final PageController controller = PageController(initialPage: tabIndex);
    
        return PageView(
          scrollDirection: Axis.horizontal,
          controller: controller,
          children: const <Widget>[
            Center(child: Text('First Page')),
            Center(child: Text('Second Page')),
            Center(child: Text('Third Page')),
          ],
        );
      }
    }
    

    我希望你能从中得到一个想法。

    【讨论】:

    • 谢谢,现在我可以在我的应用程序的任何地方使用这个逻辑。这工作得很好:)
    猜你喜欢
    • 2016-07-06
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多