Flutter 重新绘制时颤振控制器索引不正确
在重新生成选项卡时,我很难在tabController中重新建立正确的索引 基本上作为一个例子:Flutter 重新绘制时颤振控制器索引不正确,flutter,tabs,Flutter,Tabs,在重新生成选项卡时,我很难在tabController中重新建立正确的索引 基本上作为一个例子: 从3个标签开始 滑动到第三个选项卡 按FAB键生成新的制表符(现在为4),并重新建立制表符长度和初始索引 当尝试向右滑动时,tab会突然直接转到第三个tab,然后滑动到第四个tab 我期望的是刷到第二个标签 有人能解释我遗漏了什么吗 这是密码 控制器 import 'package:get/get.dart'; import 'package:flutter/material.dart'; cla
import 'package:get/get.dart';
import 'package:flutter/material.dart';
class TestPageOneCtrl extends GetxController with SingleGetTickerProviderMixin {
late TabController tabController;
RxInt indexCtrl = 0.obs;
List<String> names = ['Test One', 'Test Two', 'Test Three'];
@override
Future<void> onInit() async {
tabController = TabController(
length: 3,
vsync: this,
initialIndex: 0,
);
super.onInit();
}
void indexChange({required int index}) {
names = names.length == 3
? ['Page One', 'Page Two', 'Page Three', 'Page four']
: ['Page One', 'Page Two', 'Page Three'];
tabController = TabController(
length: names.length,
vsync: this,
initialIndex: 0,
);
tabController.animation?..addListener(indexTabSwipeChange);
tabController.index = 0;
indexCtrl.value = 0;
update(['TextPageOneCrl']);
}
//UPDATE 0.1: ADDED listener to tabController value
void indexTabSwipeChange() {
print(
'indexTabSwipeChange: ${(tabController.animation!.value).round().toString()}');
}
}
import'package:get/get.dart';
进口“包装:颤振/材料.省道”;
类TestPageOneCtrl使用SingleGetTickerProviderMixin扩展GetxController{
晚期TabController-TabController;
RxInt indexCtrl=0.obs;
列表名称=[‘测试一’、‘测试二’、‘测试三’];
@凌驾
Future onInit()异步{
tabController=tabController(
长度:3,
vsync:这个,,
初始索引:0,
);
super.onInit();
}
void indexChange({required int index}){
名称=名称。长度==3
?[“第一页”、“第二页”、“第三页”、“第四页”]
:[“第一页”、“第二页”、“第三页];
tabController=tabController(
长度:names.length,
vsync:这个,,
初始索引:0,
);
tabController.animation?.addListener(indexTabSwipeChange);
tabController.index=0;
indexCtrl.value=0;
更新(['textpagenecrl']);
}
//更新0.1:将侦听器添加到tabController值
void index abswipechange(){
印刷品(
'IndexAbsWipeChange:${(tabController.animation!.value.round().toString()}');
}
}
看法
导入“包装:颤振/材料.省道”;
导入“package:flatter/widgets.dart”;
导入“package:get/get.dart”;
导入“../widgets/tab_bar_item_widget.dart”;
导入“测试页面”和“控制标线”;
类TestPageOneView扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回GetBuilder(
init:TestPageOneCtrl(),
id:'textpagenecrl',
生成器:(testPageOneCtrl){
返回脚手架(
浮动操作按钮:浮动操作按钮(
onPressed:testPageOneCtrl.change,
子项:常量图标(Icons.navigation),
背景颜色:Colors.green,
),
正文:安全区(
子:嵌套滚动视图(
headerSliverBuilder:(上下文,InnerBoxIsCrowled){
返回[
滑杆(
底部:选项卡栏(
控制器:testPageOneCtrl.tabController,
isScrollable:是的,
选项卡:List.generate(
testPageOneCtrl.tabController.length,
(索引){
返回TabBarItemWidget(
名称:testPageOneCtrl.names[索引],
);
},
),
),
)
];
},
正文:选项卡视图(
控制器:testPageOneCtrl.tabController,
子项:List.generate(
testPageOneCtrl.names.length,
(索引){
返回生成器(生成器:(上下文){
返回中心(
子:容器(
子项:文本(testPageOneCtrl.names[index]);
});
},
),
),
),
),
);
},
);
}
}
提前谢谢
更新0.1 将侦听器添加到tabController,以便在滑动时打印其值 这是我得到的
谢谢添加选项卡后,您想从哪里开始?来自索引0或索引3?感谢您回答您的问题,来自索引0的@TharunK。虽然添加以下行可以修复它,但实际上得到了相同的结果:tabController.index=0;我注意到,UI没有更新,TabView仍然是索引2的一部分,索引2是第三个选项卡,但是选项卡控制器位于索引0,索引0是第一个选项卡。因此,您还必须将UI设置为索引0,而不仅仅是控制器索引。如果你还不明白或者不知道如何解决这个问题,让我知道,我会在你的replyHi@TharunK之后尝试找到解决办法,我确实理解你的意思,虽然,UI似乎在相应地更新,因为在生成新选项卡时,所选选项卡为0,但在滑动tabController时,仍然认为它在上一个索引上。不知道如何解决它,我会尝试更新,如果有任何进展,谢谢!
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import '../../widgets/tab_bar_item_widget.dart';
import 'test_page_one_ctrl.dart';
class TestPageOneView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetBuilder<TestPageOneCtrl>(
init: TestPageOneCtrl(),
id: 'TextPageOneCrl',
builder: (testPageOneCtrl) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: testPageOneCtrl.change,
child: const Icon(Icons.navigation),
backgroundColor: Colors.green,
),
body: SafeArea(
child: NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
bottom: TabBar(
controller: testPageOneCtrl.tabController,
isScrollable: true,
tabs: List<Widget>.generate(
testPageOneCtrl.tabController.length,
(index) {
return TabBarItemWidget(
name: testPageOneCtrl.names[index],
);
},
),
),
)
];
},
body: TabBarView(
controller: testPageOneCtrl.tabController,
children: List<Widget>.generate(
testPageOneCtrl.names.length,
(index) {
return Builder(builder: (context) {
return Center(
child: Container(
child: Text(testPageOneCtrl.names[index])));
});
},
),
),
),
),
);
},
);
}
}