首页 > 解决方案 > Flutter Tabcontroller 不要滑动标签直到填充当前

问题描述

tabController我定义侦听器时,它仅适用于 onTap,但当用手指滑动时,它的工作方式不同。我正在测试的是,给定一个条件或填写一个表格,用户可能会或可能不会进入下一个选项卡,它仅在用户使用onTap但如果他刷它不起作用时才有效,迫使我放physics: 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),
          )),
        ],
      ),
    );
  }
}

标签: flutter

解决方案


推荐阅读