Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 如何检测到TabBarView刚刚被拖动?_Dart_Flutter - Fatal编程技术网

Dart 如何检测到TabBarView刚刚被拖动?

Dart 如何检测到TabBarView刚刚被拖动?,dart,flutter,Dart,Flutter,TabBar小部件有一个onTap()回调,允许检测用户何时刚刚按下选项卡。这非常有用,这样我们就可以准备新的选项卡视图来显示一些动态数据 TabBar小部件还具有拖动功能,允许更改显示的tabView(与点击另一个选项卡的结果类似)。但在本例中,似乎无法准备新的选项卡视图,因为没有onDrag()回调 所以问题是:有没有一种方法可以检测到TabBarView刚刚被拖动?您可以使用并添加一个侦听器来观察更改。它适用于点击和拖动事件/动作 您可以这样做: _tabController.addLis

TabBar小部件有一个onTap()回调,允许检测用户何时刚刚按下选项卡。这非常有用,这样我们就可以准备新的选项卡视图来显示一些动态数据

TabBar小部件还具有拖动功能,允许更改显示的tabView(与点击另一个选项卡的结果类似)。但在本例中,似乎无法准备新的选项卡视图,因为没有onDrag()回调

所以问题是:有没有一种方法可以检测到TabBarView刚刚被拖动?

您可以使用并添加一个侦听器来观察更改。它适用于点击和拖动事件/动作

您可以这样做:

_tabController.addListener(() {
    print("${_tabController.index}");
});

我发现这个解决方案可以区分点击新标签和滑动到新标签事件

这看起来很尴尬,但很有效。遗憾的是,无法检测到刷卡的开始

@override
  void initState() {
    print("FB:X _HNPageState:initState()");
    _tabController = TabController(vsync: this, length: _myTabs.length);
    _tabController.addListener(() {
      if (_tabController.indexIsChanging)
        // Tab Changed tapping on new tab
       onTabTap();
      else if(_tabController.index != _tabController.previousIndex)
        // Tab Changed swiping to a new tab
        onTabDrag();
    });
    super.initState();
  }

以前的答案只考虑用户完成拖动。 如果您需要监听更精确的数据(即用户刚刚开始拖动),您可以监听动画:

_tabController.animation.addListener(() => print(_tabController.animation.value.toString));
这是我的解决方案

 if (_tabController.indexIsChanging || 
    (_tabController.animation.value == _tabController.index)) {
  print(_tabController.index);

  Provider.of<OrderScreenProvider>(context, listen: false).onIndexChangeResetAccountInfo();
}
if(_tabController.indexIsChanging | |
(_tabController.animation.value==_tabController.index)){
打印(tabController.index);
Provider.of(context,listen:false).onIndexChangeResetAccountInfo();
}

就我而言;在我将tabcontroller设置为TabView控制器之前,tab drag更改不能使用tabcontroller处理

这样处理,

void _handleTabSelection() {
    if (_tabController.indexIsChanging || _tabController.index != _tabController.previousIndex) {
      setState(() {
        _selectedTab = _tabController.index;
      });
    }
  }
并设定它

TabBarView(
   controller: _tabController,
   ...



TabBar(
      controller: _tabController,
    ...

它同时检测标签点击和滑动。我需要区分它们。点击或拖动时,您真的需要执行不同的操作吗?如果您需要禁用其中一个选项卡,请注意,我需要对它们进行不同的处理,因为拖动会在选项卡控制器上生成两个事件(一个用于拖动开始,另一个用于拖动结束)。在我的事件处理程序中,我需要加载(只加载一次)新tabView的元素。顺便说一句,您已经将第二个处理程序重命名为onTabDrag,因为它实际上执行不同的操作