Flutter 颤振选项卡控制器索引不响应选项卡视图中的更改
颤振tabcontroller检测tabbar中的更改,但不知道tabbarview中的更改 侦听器会导致floatingactionbutton的文本发生更改,但当tabbarview发生更改时,不会有响应Flutter 颤振选项卡控制器索引不响应选项卡视图中的更改,flutter,Flutter,颤振tabcontroller检测tabbar中的更改,但不知道tabbarview中的更改 侦听器会导致floatingactionbutton的文本发生更改,但当tabbarview发生更改时,不会有响应 class TabPageState extends State<TabPage> with SingleTickerProviderStateMixin { TabController _controller; int _currentIndex = 0; @
class TabPageState extends State<TabPage> with SingleTickerProviderStateMixin {
TabController _controller;
int _currentIndex = 0;
@override
void initState() {
super.initState();
_controller = TabController(vsync: this, length: 2);
_controller.addListener(_handleTabSelection);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Tab'),
bottom: TabBar(
controller: _controller,
tabs: <Widget>[
Tab(icon: Icon(Icons.laptop_mac),),
Tab(icon: Icon(Icons.desktop_mac),),
],
),
),
body: TabBarView(
controller: _controller,
children: <Widget>[
Center(child: Text('laptop'),),
Center(child: Text('desctop'),),
],
),
floatingActionButton: FloatingActionButton(
onPressed: (){},
child: Text('$_currentIndex'),
),
);
}
_handleTabSelection() {
if (_controller.indexIsChanging) {
setState(() {
_currentIndex = _controller.index;
});
}
}
}
类TabPageState使用SingleTickerProviderStateMixin扩展状态{
TabController\u控制器;
int _currentIndex=0;
@凌驾
void initState(){
super.initState();
_controller=TabController(vsync:this,长度:2);
_controller.addListener(_handleabselection);
}
@凌驾
无效处置(){
_controller.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“颤振选项卡”),
底部:选项卡栏(
控制器:_控制器,
选项卡:[
选项卡(图标:图标(图标.笔记本电脑),
选项卡(图标:图标(Icons.desktop\u mac)),
],
),
),
正文:选项卡视图(
控制器:_控制器,
儿童:[
中心(子项:文本(“笔记本电脑”),),
居中(子项:文本('desctop'),),
],
),
浮动操作按钮:浮动操作按钮(
按下:(){},
子项:文本(“$\u currentIndex”),
),
);
}
_HandletAbs选举(){
如果(_controller.indexIsChanging){
设置状态(){
_currentIndex=_controller.index;
});
}
}
}
只需删除以下条件:
if (_controller.indexIsChanging) {
因为每次您开始从previousIndex更改为currentIndex时,都会重新生成小部件和\u控制器。索引与初始索引相同
这应该起作用:
_handleTabSelection() {
setState(() {
_currentIndex = _controller.index;
});
}
医生说:
索引更改:当我们将[previousIndex]动画化为[index]时,为True
调用[animateTo]的结果。这个值是真的
当///用户
轻触[选项卡栏]选项卡。当[offset]作为一个变量更改时,它为false///
用户拖动(和“投掷”)[TabBarView]的结果
代码:
TabController _controller;
int _selectedIndex = 0;
List<Widget> list = [
Tab(icon: Icon(Icons.card_travel)),
Tab(icon: Icon(Icons.add_shopping_cart)),
];
@override
void initState() {
// TODO: implement initState
super.initState();
// Create TabController for getting the index of current tab
_controller = TabController(length: list.length, vsync: this);
_controller.addListener(() {
setState(() {
_selectedIndex = _controller.index;
});
print("Selected Index: " + _controller.index.toString());
});
}
TabController\u控制器;
int _selectedIndex=0;
列表=[
选项卡(图标:图标(Icons.card_travel)),
选项卡(图标:图标(图标.添加购物车)),
];
@凌驾
void initState(){
//TODO:实现initState
super.initState();
//创建TabController以获取当前选项卡的索引
_controller=TabController(长度:list.length,vsync:this);
_controller.addListener(){
设置状态(){
_selectedIndex=\u controller.index;
});
打印(“所选索引:”+_controller.Index.toString());
});
}
示例:
输出:
TabController _controller;
int _selectedIndex = 0;
List<Widget> list = [
Tab(icon: Icon(Icons.card_travel)),
Tab(icon: Icon(Icons.add_shopping_cart)),
];
@override
void initState() {
// TODO: implement initState
super.initState();
// Create TabController for getting the index of current tab
_controller = TabController(length: list.length, vsync: this);
_controller.addListener(() {
setState(() {
_selectedIndex = _controller.index;
});
print("Selected Index: " + _controller.index.toString());
});
}