TabBar 小部件有一个 onTap() 回调,它允许检测用户何时刚刚按下了一个选项卡。这很有用,因此我们可以准备新的 tabView 来显示一些动态数据。
TabBar 小部件还有一个拖动功能,允许更改显示的 tabView(类似于点击另一个选项卡的结果)。但在这种情况下,似乎没有办法准备新的 TabView,因为没有 onDrag() 回调。
所以问题是:有没有办法检测到 TabBarView 刚刚被拖动?
我发现这个解决方案可以区分点击新标签和滑动到新标签事件。
它看起来很尴尬,但它正在工作。遗憾的是,无法检测到滑动的开始。
@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();
}
Run Code Online (Sandbox Code Playgroud)
这对我有用:
int _tab = 0;
@override
void initState() {
super.initState();
_tabController = TabController(
length: _tabs.length,
vsync: this
);
_tabController.animation!.addListener(_tabListener);
}
void _tabListener(){
if(_tab != _tabController.animation!.value.round()){
setState(() {
_tab = _tabController.animation!.value.round();
});
}
}
Run Code Online (Sandbox Code Playgroud)
以前的答案仅考虑用户何时完成拖动。
如果您需要监听更准确的数据(即用户刚刚开始拖动),您可以监听动画:
_tabController.animation.addListener(() => print(_tabController.animation.value.toString));
Run Code Online (Sandbox Code Playgroud)
您可以使用TabController并添加侦听器来观察更改。它适用于点击和拖动事件/操作。
你可以这样做:
_tabController.addListener(() {
print("${_tabController.index}");
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3313 次 |
| 最近记录: |