TabBar小部件具有onTap()回调,该回调可检测用户何时按下了选项卡。这很有用,因此我们可以准备新的tabView来显示一些动态数据。
TabBar小部件还具有拖动功能,该功能允许更改显示的tabView(与点击另一个选项卡的结果类似)。但是在这种情况下,由于没有onDrag()回调,因此似乎无法准备新的TabView。
所以问题是:有没有办法检测TabBarView刚刚被拖动?
答案 0 :(得分:2)
以前的答案仅在用户完成拖动时才考虑。
如果您需要收听更准确的数据(即用户刚开始拖动),则可以收听动画:
_tabController.animation.addListener(() => print(_tabController.animation.value.toString));
答案 1 :(得分:1)
您可以使用TabController并添加一个侦听器来观看更改。它适用于点击和拖动事件/动作。
您可以执行以下操作:
_tabController.addListener(() {
print("${_tabController.index}");
});
答案 2 :(得分:1)
这是我的解决方案;
if (_tabController.indexIsChanging ||
(_tabController.animation.value == _tabController.index)) {
print(_tabController.index);
Provider.of<OrderScreenProvider>(context, listen: false).onIndexChangeResetAccountInfo();
}
答案 3 :(得分:0)
我发现此解决方案可以区分点击新标签页和滑动到新标签页事件。
它看起来很尴尬,但是可以正常工作。遗憾的是无法检测到滑动的开始。
@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();
}
答案 4 :(得分:0)
就我而言;在我将其设置为TabView控制器之前,无法使用tabcontroller处理制表符拖动更改。
这样处理;
void _handleTabSelection() {
if (_tabController.indexIsChanging || _tabController.index != _tabController.previousIndex) {
setState(() {
_selectedTab = _tabController.index;
});
}
}
并设置它;
TabBarView(
controller: _tabController,
...
TabBar(
controller: _tabController,
...