代码之家  ›  专栏  ›  技术社区  ›  arielnmz

如何防止向一个方向滚动?

  •  1
  • arielnmz  · 技术社区  · 7 年前

    TabBarView 我只想在一个方向上滚动。这就是我迄今为止所尝试的:

    class NoForwardNavScrollPhysics extends ClampingScrollPhysics {
      const NoForwardNavScrollPhysics({ ScrollPhysics parent }) : super(parent: parent);
    
      @override
      NoForwardNavScrollPhysics applyTo(ScrollPhysics ancestor) {
        return new NoForwardNavScrollPhysics(parent: buildParent(ancestor));
      }
    
      @override
      double applyPhysicsToUserOffset(ScrollMetrics position, double offset) {
        return 0.0;
      }
    }
    
    ...
    
    TabBarView(
      physics: NoForwardNavScrollPhysics(),
      ...
    );
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jacob Phillips    7 年前

    定义一个 TabController TabBarView 并使用控制器的 addListener 方法来检查控制器的 index , previousIndex indexIsChanging 财产。

    class MyTabbedPage extends StatefulWidget {
      const MyTabbedPage({ Key key }) : super(key: key);
      @override
      _MyTabbedPageState createState() => new _MyTabbedPageState();
    }
    
    class _MyTabbedPageState extends State<MyTabbedPage> with SingleTickerProviderStateMixin {
      final List<Tab> myTabs = <Tab>[
        new Tab(text: 'LEFT'),
        new Tab(text: 'RIGHT'),
      ];
    
      TabController _tabController;
    
      @override
      void initState() {
        super.initState();
        _tabController = new TabController(vsync: this, length: myTabs.length);
        _tabController.addListener(_denyForwardsTab);
      }
    
      void _denyForwardsTab() {
        if (_tabController.index == _tabController.previousIndex + 1) {
          setState(() => _tabController.index = _tabController.previousIndex);
        }
      }
    
     @override
     void dispose() {
       _tabController.dispose();
       super.dispose();
     }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            bottom: new TabBar(
              controller: _tabController,
              tabs: myTabs,
            ),
          ),
          body: new TabBarView(
            controller: _tabController,
            children: myTabs.map((Tab tab) {
              return new Center(child: new Text(tab.text));
            }).toList(),
          ),
        );
      }
    }