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(上下文);
},
),
],
),
),
),
);
}
}
我用代码编辑了答案: