Flutter 我们能用抽屉按钮控制颤振标签的位置吗

Flutter 我们能用抽屉按钮控制颤振标签的位置吗,flutter,dart,tabbar,drawer,Flutter,Dart,Tabbar,Drawer,我想创建一个用户界面,用户可以通过单击选项卡或按下抽屉上的按钮来切换选项卡。有点像做一件事的两个控件 这是可能的还是我问错了问题?这不是一个非常错误的问题。是的,这是可能的。可以为两个控件定义相同的方法 编辑 下面是一个完整的代码示例: import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { final appTitl

我想创建一个用户界面,用户可以通过单击选项卡或按下抽屉上的按钮来切换选项卡。有点像做一件事的两个控件


这是可能的还是我问错了问题?

这不是一个非常错误的问题。是的,这是可能的。可以为两个控件定义相同的方法

编辑

下面是一个完整的代码示例:


import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  final appTitle = 'Drawer Demo';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: appTitle,
      home: MyHomePage(title: appTitle),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  TabController _tabController;

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

  @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 DefaultTabController(
      length: 2,
      child: Scaffold(
        appBar: AppBar(
          bottom: TabBar(
            onTap: (index) {
              print("index");
              print(index);
            },
            controller: _tabController,
            tabs: myTabs,
          ),
          title: Text('Tabs Demo'),
        ),
        body: TabBarView(
          controller: _tabController,
          children: myTabs.map((Tab tab) {
            return Center(child: Text(tab.text));
          }).toList(),
        ),
        drawer: Drawer(
          // Add a ListView to the drawer. This ensures the user can scroll
          // through the options in the drawer if there isn't enough vertical
          // space to fit everything.
          child: ListView(
            // Important: Remove any padding from the ListView.
            padding: EdgeInsets.zero,
            children: <Widget>[
              DrawerHeader(
                child: Text('Drawer Header'),
                decoration: BoxDecoration(
                  color: Colors.blue,
                ),
              ),
              ListTile(
                title: Text('LEFT'),
                onTap: () {
                  // Update the state of the app
                  // ...
                  // Then close the drawer
                  setState(() {
                    _tabController.index = 0;
                  });
                  Navigator.pop(context);
                },
              ),
              ListTile(
                title: Text('RIGHT'),
                onTap: () {
                  // Update the state of the app
                  // ...
                  // Then close the drawer
                  setState(() {
                    _tabController.index = 1;
                  });
                  Navigator.pop(context);
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}


进口“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
最终appTitle=‘抽屉演示’;
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:appTitle,
主页:我的主页(标题:appTitle),
);
}
}
类MyHomePage扩展StatefulWidget{
最后的字符串标题;
MyHomePage({Key,this.title}):超级(Key:Key);
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态
使用SingleTickerProviderStateMixin{
TabController\u TabController;
最终列表myTabs=[
新建选项卡(文本:“左”),
新建选项卡(文本:“右”),
];
@凌驾
void initState(){
super.initState();
_tabController=newtabcontroller(vsync:this,length:myTabs.length);
}
@凌驾
无效处置(){
_tabController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回DefaultTabController(
长度:2,
孩子:脚手架(
appBar:appBar(
底部:选项卡栏(
onTap:(索引){
印刷品(“索引”);
打印(索引);
},
控制器:\ tab控制器,
标签:我的标签,
),
标题:文本(“选项卡演示”),
),
正文:选项卡视图(
控制器:\ tab控制器,
子项:myTabs.map((选项卡){
返回中心(子项:文本(制表符文本));
}).toList(),
),
抽屉(
//向抽屉添加列表视图。这确保用户可以滚动
//如果没有足够的垂直线,请通过抽屉中的选项
//空间适合所有东西。
子:ListView(
//重要提示:从ListView中删除任何填充。
填充:EdgeInsets.zero,
儿童:[
抽屉阅读器(
子项:文本(“抽屉标题”),
装饰:盒子装饰(
颜色:颜色,蓝色,
),
),
列表砖(
标题:文本(“左”),
onTap:(){
//更新应用程序的状态
// ...
//然后关上抽屉
设置状态(){
_tabController.index=0;
});
Navigator.pop(上下文);
},
),
列表砖(
标题:文本(“右”),
onTap:(){
//更新应用程序的状态
// ...
//然后关上抽屉
设置状态(){
_tabController.index=1;
});
Navigator.pop(上下文);
},
),
],
),
),
),
);
}
}

我用代码编辑了答案: