Flutter 颤振选项卡控制器在填充电流之前不滑动选项卡

Flutter 颤振选项卡控制器在填充电流之前不滑动选项卡,flutter,Flutter,在选项卡controller中,当我定义Listener时,它只在onTap中工作,但当用手指滑动时,它的工作方式不同。我正在测试的是,给定一个条件或填写一个表单,用户可能会也可能不会进入下一个选项卡,它只在用户使用onTap时起作用,但如果他滑动它不起作用,则迫使我放入物理:NeverScrollableScrollPhysics(),从而消除了用户这样做的可能性 class BookingHotel extends StatefulWidget { @override _Bookin

选项卡controller
中,当我定义Listener时,它只在onTap中工作,但当用手指滑动时,它的工作方式不同。我正在测试的是,给定一个条件或填写一个表单,用户可能会也可能不会进入下一个选项卡,它只在用户使用
onTap
时起作用,但如果他滑动它不起作用,则迫使我放入
物理:NeverScrollableScrollPhysics()
,从而消除了用户这样做的可能性

class BookingHotel extends StatefulWidget {
  @override
  _BookingHotelState createState() => _BookingHotelState();
}

class _BookingHotelState extends State<BookingHotel>
    with SingleTickerProviderStateMixin {
  late TabController _tabController;
  int _selectedIndex = 0;
  bool flag = true;

  List<Widget> tabs = [
    Tab(text: 'Datos Reserva', icon: Icon(Icons.card_travel)),
    Tab(text: 'Datos Cliente', icon: Icon(Icons.person_add)),
    Tab(text: 'Envío', icon: Icon(Icons.description)),
  ];

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    // Create TabController for getting the index of current tab
    _tabController = TabController(length: tabs.length, vsync: this);

    _tabController.addListener(() {
      if (_tabController.indexIsChanging) {
        //print('UndexIsChanging');
        if (flag) {
          setState(() {
            _selectedIndex = _tabController.index;
            _tabController.animateTo(0);
            print("Selected Index: " + _tabController.index.toString());
          });
        } else {
          print('else');
          setState(() {
            _tabController.animateTo(_selectedIndex);
          });
        }
      }

      //print("Selected Index: " + _tabController.index.toString());
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        bottom: TabBar(
          indicator: BoxDecoration(
              borderRadius: BorderRadius.circular(20), color: Colors.red),
          indicatorWeight: 10.0,
          controller: _tabController,
          tabs: tabs,
        ),
      ),
      body: TabBarView(
        physics: NeverScrollableScrollPhysics(),
        controller: _tabController,
        children: [
          Center(
              child: Text(
            _selectedIndex.toString() + 'Tab1',
            style: TextStyle(fontSize: 40),
          )),
          Center(
              child: Text(
            _selectedIndex.toString() + 'Tab2',
            style: TextStyle(fontSize: 40),
          )),
          Center(
              child: Text(
            _selectedIndex.toString() + 'Tab3',
            style: TextStyle(fontSize: 40),
          )),
        ],
      ),
    );
  }
}
class BookingHotel扩展了StatefulWidget{
@凌驾
_BookingHotelState createState()=>\u BookingHotelState();
}
类BookingHotelState扩展状态
使用SingleTickerProviderStateMixin{
late-TabController\u-TabController;
int _selectedIndex=0;
布尔标志=真;
列表选项卡=[
选项卡(文本:“Datos Reserva”,图标:图标(Icons.card_travel)),
选项卡(文本:“Datos客户”,图标:图标(Icons.person_add)),
选项卡(文本:“Envío”,图标:图标(Icons.description)),
];
@凌驾
void initState(){
//TODO:实现initState
super.initState();
//创建TabController以获取当前选项卡的索引
_tabController=tabController(长度:tabs.length,vsync:this);
_tabController.addListener((){
if(tab controller.indexIsChanging){
//打印(“不改变方向”);
国际单项体育联合会(旗){
设置状态(){
_selectedIndex=\u tabController.index;
_tabController.animateTo(0);
打印(“所选索引:”+_tabController.Index.toString());
});
}否则{
打印(‘其他’);
设置状态(){
_tabController.animateTo(_selectedIndex);
});
}
}
//打印(“所选索引:”+_tabController.Index.toString());
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
底部:选项卡栏(
指标:盒子装饰(
边界半径:边界半径。圆形(20),颜色:颜色。红色),
指示器重量:10.0,
控制器:\ tab控制器,
标签:标签,
),
),
正文:选项卡视图(
物理学:NeverscrollableScroll物理学(),
控制器:\ tab控制器,
儿童:[
居中(
子:文本(
_已选择dex.toString()+“Tab1”,
样式:TextStyle(字体大小:40),
)),
居中(
子:文本(
_已选择dex.toString()+“Tab2”,
样式:TextStyle(字体大小:40),
)),
居中(
子:文本(
_已选择dex.toString()+“Tab3”,
样式:TextStyle(字体大小:40),
)),
],
),
);
}
}