Flutter 重新绘制时颤振控制器索引不正确

Flutter 重新绘制时颤振控制器索引不正确,flutter,tabs,Flutter,Tabs,在重新生成选项卡时,我很难在tabController中重新建立正确的索引 基本上作为一个例子: 从3个标签开始 滑动到第三个选项卡 按FAB键生成新的制表符(现在为4),并重新建立制表符长度和初始索引 当尝试向右滑动时,tab会突然直接转到第三个tab,然后滑动到第四个tab 我期望的是刷到第二个标签 有人能解释我遗漏了什么吗 这是密码 控制器 import 'package:get/get.dart'; import 'package:flutter/material.dart'; cla

在重新生成选项卡时,我很难在tabController中重新建立正确的索引

基本上作为一个例子:

  • 从3个标签开始
  • 滑动到第三个选项卡
  • 按FAB键生成新的制表符(现在为4),并重新建立制表符长度和初始索引
  • 当尝试向右滑动时,tab会突然直接转到第三个tab,然后滑动到第四个tab
  • 我期望的是刷到第二个标签

    有人能解释我遗漏了什么吗

    这是密码

    控制器

    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,以便在滑动时打印其值

    这是我得到的

  • 从3个标签开始
  • 滑动到第三个选项卡
  • 值侦听器打印为:0,1,2
  • 生成选项卡
  • tabController索引值为0(零),但在滑动时,它从旧索引开始
  • 在将tabController预设重置为索引0时不应该


    谢谢

    添加选项卡后,您想从哪里开始?来自索引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])));
                        });
                      },
                    ),
                  ),
                ),
              ),
            );
          },
        );
      }
    }