Как я могу отключить определенную вкладку на панели вкладок, чтобы иметь возможность нажимать?

#dart #flutter

#dart #флаттер

Вопрос:

есть ли способ отключить определенную вкладку на панели вкладок? чтобы ее нельзя было щелкнуть, если она не будет включена снова? любая помощь приветствуется, спасибо!

Редактировать: код с указателем поглощения / игнорирования не работает:

 class MyTabbedPage extends StatefulWidget {
  const MyTabbedPage({Key key}) : super(key: key);
  @override
  _MyTabbedPageState createState() => new _MyTabbedPageState();
}

class _MyTabbedPageState extends State<MyTabbedPage>
    with SingleTickerProviderStateMixin {
  final List<Tab> myTabs = <Widget>[
Tab(text: 'LEFT'),
    AbsorbPointer(
child: Tab(text: 'RIGHT')), //not working
  ];

  TabController _tabController;

  @override
  void initState() {
    super.initState();
    _tabController = new TabController(vsync: this, length: myTabs.length);
  }

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        bottom: new TabBar(
          controller: _tabController,
          tabs: myTabs,
        ),
      ),
      body: new TabBarView(
        controller: _tabController,
        children: myTabs.map((Tab tab) {
          return new Center(child: new Text(tab.text));
        }).toList(),
      ),
    );
  }
}
 

Комментарии:

1. Попробуйте использовать AbsorbPointer

2. это не работает, когда я оборачиваю указатель поглощения вокруг виджета вкладки, возможно, жесты на вкладках доступны из любого другого места?

3. Пожалуйста, добавьте свой код.

4. @MangaldeepPannu готово, пожалуйста, ознакомьтесь с обновленным вопросом.

Ответ №1:

Вот и все:

Добавьте список, чтобы указать, какая вкладка отключена

 List<bool> _isDisabled = [false, true];
 

Добавьте слушателя в _tabController

 _tabController.addListener(onTap);
 

onTap() метод. Если выбранная вкладка отключена, мы вернемся к предыдущей выбранной вкладке.

 onTap() {
  if (_isDisabled[_tabController.index]) {
    int index = _tabController.previousIndex;
    setState(() {
      _tabController.index = index;
    });
  }
}
 

Ниже приведен полный код:

 import 'package:flutter/material.dart';

class MyTabbedPage extends StatefulWidget {
  const MyTabbedPage({Key key}) : super(key: key);
  @override
  _MyTabbedPageState createState() => _MyTabbedPageState();
}

class _MyTabbedPageState extends State<MyTabbedPage>
    with SingleTickerProviderStateMixin {
  List<bool> _isDisabled = [false, true];

  final List<Tab> myTabs = <Tab>[
    Tab(text: 'LEFT'),
    Tab(text: 'RIGHT'),
  ];

  TabController _tabController;

  onTap() {
    if (_isDisabled[_tabController.index]) {
      int index = _tabController.previousIndex;
      setState(() {
        _tabController.index = index;
      });
    }
  }

  @override
   void initState() {
    super.initState();
    _tabController = TabController(vsync: this, length: myTabs.length);
    _tabController.addListener(onTap);
  }

  @override
    void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        bottom: TabBar(
          controller: _tabController,
          tabs: myTabs,
        ),
      ),
      body: TabBarView(
        controller: _tabController,
        children: myTabs.map((Tab tab) {
          return Center(child: new Text(tab.text));
        }).toList(),
      ),
    );
  }
}
 

Комментарии:

1. большое спасибо за ответ, я скоро попробую его, чтобы посмотреть, работает ли он.

2. Не торопитесь, если у вас есть какие-либо сомнения, пожалуйста, спросите.

3. большое вам спасибо, все сработало, как ожидалось, я хотел спросить, можно ли также использовать эту логику для отключения прокрутки? например, если следующая вкладка указана как отключенная, мы не можем провести пальцем вперед к следующей отключенной вкладке, но мы можем провести пальцем назад?

4. Попробуйте использовать pub.dartlang.org/packages/swipedetector , Я обновлю свой ответ позже, в настоящее время сдаю экзамены

5. Это решение действительно работало для нажатия. Для прокрутки я устанавливаю физику на TabBarView NeverScrollableScrollPhysics()

Ответ №2:

 TabBar(
          tabs: [
            Tab(icon: Icon(Icons.directions_car)), //enabled
            Tab(icon: Icon(Icons.directions_transit), onTap: null), //disabled
            Tab(icon: Icon(Icons.directions_bike)),
          ],
        ),
 

Комментарии:

1. Привет, пожалуйста, добавьте некоторое объяснение, почему это решение. Спасибо

2. на вкладке нет такого свойства, как «onTap».

3. onTap является параметром для TabBar .