Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 如何禁用tabbar中的特定选项卡,以便能够单击?_Dart_Flutter - Fatal编程技术网

Dart 如何禁用tabbar中的特定选项卡,以便能够单击?

Dart 如何禁用tabbar中的特定选项卡,以便能够单击?,dart,flutter,Dart,Flutter,有没有办法禁用选项卡栏中的特定选项卡?因此,除非再次启用,否则无法单击它?感谢您的帮助,谢谢 编辑:吸收/忽略指针不工作的代码: class MyTabbedPage extends StatefulWidget { const MyTabbedPage({Key key}) : super(key: key); @override _MyTabbedPageState createState() => new _MyTabbedPageState(); } class _M

有没有办法禁用选项卡栏中的特定选项卡?因此,除非再次启用,否则无法单击它?感谢您的帮助,谢谢

编辑:吸收/忽略指针不工作的代码:

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(),
      ),
    );
  }
}
类MyTabbedPage扩展StatefulWidget{
constmytabbedpage({Key}):super(Key:Key);
@凌驾
_MyTabbedPageState createState()=>new_MyTabbedPageState();
}
类_MyTabbedPageState扩展状态
使用SingleTickerProviderStateMixin{
最终列表myTabs=[
选项卡(文本:“左”),
吸收点(
子项:选项卡(文本:“右”),//不工作
];
TabController\u TabController;
@凌驾
void initState(){
super.initState();
_tabController=newtabcontroller(vsync:this,length:myTabs.length);
}
@凌驾
无效处置(){
_tabController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
底部:新选项卡栏(
控制器:\ tab控制器,
标签:我的标签,
),
),
正文:新选项卡视图(
控制器:\ tab控制器,
子项:myTabs.map((选项卡){
返回新中心(子项:新文本(tab.Text));
}).toList(),
),
);
}
}
给你:

添加列表以确定禁用的选项卡

List<bool> _isDisabled = [false, true];
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(),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
类MyTabbedPage扩展StatefulWidget{
constmytabbedpage({Key}):super(Key:Key);
@凌驾
_MyTabbedPageState createState()=>\u MyTabbedPageState();
}
类_MyTabbedPageState扩展状态
使用SingleTickerProviderStateMixin{
列表_isDisabled=[false,true];
最终列表myTabs=[
选项卡(文本:“左”),
选项卡(文本:“右”),
];
TabController\u TabController;
onTap(){
如果(_isDisabled[_tabController.index]){
int index=_tabController.previousIndex;
设置状态(){
_tabController.index=索引;
});
}
}
@凌驾
void initState(){
super.initState();
_tabController=tabController(vsync:this,length:myTabs.length);
_tabController.addListener(onTap);
}
@凌驾
无效处置(){
_tabController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
底部:选项卡栏(
控制器:\ tab控制器,
标签:我的标签,
),
),
正文:选项卡视图(
控制器:\ tab控制器,
子项:myTabs.map((选项卡){
返回中心(子项:新文本(制表符文本));
}).toList(),
),
);
}
}

尝试使用AbsorbPointer。当我将AbsorbPointer包装在选项卡小部件上时,它不起作用,可能选项卡上的手势是从其他任何地方访问的?请添加代码。@MangaldeepPannu完成,请查看更新的问题。您好,请添加一些解释,说明为什么这是一个解决方案。感谢选项卡中没有“onTap”这样的属性。
onTap
TabBar
的一个参数。非常感谢您的回答,我将很快试用它,看看它是否有效。请慢慢来,如果有任何疑问,请询问。非常感谢,它按预期工作,我想问一下这个逻辑是否也可以用于禁用刷卡?例如,如果下一个选项卡被列为已禁用,则我们无法向前滑动到下一个已禁用的选项卡,但可以向后滑动?请尝试使用,我将稍后更新我的答案,目前正在使用Exams此解决方案可用于点击。对于刷卡,我将
选项卡上的物理设置为
NeverScrollableScrollPhysics()
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(),
      ),
    );
  }
}