Flutter 打开/关闭抽屉布局-颤振时,如何将导航抽屉汉堡菜单图标更改为箭头图标?
当我按照以下步骤创建抽屉布局时,它工作正常。然而,我有一个问题,这是菜单图标 在安卓系统中,我使用抽屉切换设置抽屉布局,当我打开抽屉时,菜单图标将变为箭头图标,当我关闭抽屉时,箭头图标将变为菜单图标 在颤振中,其工作原理与上述不同 如果你理解我的问题,请帮助我。我已经搜索了很多,但没有找到解决方案。所以我想问大家。非常感谢Flutter 打开/关闭抽屉布局-颤振时,如何将导航抽屉汉堡菜单图标更改为箭头图标?,flutter,Flutter,当我按照以下步骤创建抽屉布局时,它工作正常。然而,我有一个问题,这是菜单图标 在安卓系统中,我使用抽屉切换设置抽屉布局,当我打开抽屉时,菜单图标将变为箭头图标,当我关闭抽屉时,箭头图标将变为菜单图标 在颤振中,其工作原理与上述不同 如果你理解我的问题,请帮助我。我已经搜索了很多,但没有找到解决方案。所以我想问大家。非常感谢 导入“包装:颤振/材料.省道”; void main()=>runApp(MyApp()); 类MyApp扩展了无状态小部件{ 最终appTitle=‘抽屉演示’; @凌驾
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
最终appTitle=‘抽屉演示’;
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:appTitle,
主页:我的主页(标题:appTitle),
);
}
}
类MyHomePage扩展了无状态小部件{
最后的字符串标题;
MyHomePage({Key,this.title}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(标题)),
正文:居中(子项:文本(“我的页面!”),
抽屉(
//向抽屉添加列表视图。这确保用户可以滚动
//如果没有足够的垂直线,请通过抽屉中的选项
//空间适合所有东西。
子:ListView(
//重要提示:从ListView中删除任何填充。
填充:EdgeInsets.zero,
儿童:[
抽屉阅读器(
子项:文本(“抽屉标题”),
装饰:盒子装饰(
颜色:颜色,蓝色,
),
),
列表砖(
标题:文本(“项目1”),
onTap:(){
//更新应用程序的状态
// ...
//然后关上抽屉
Navigator.pop(上下文);
},
),
列表砖(
标题:文本(“项目2”),
onTap:(){
//更新应用程序的状态
// ...
//然后关上抽屉
Navigator.pop(上下文);
},
),
],
),
),
);
}
}
使用StateFulWidget
以便您可以访问setState
方法来更改图标
在您的状态中
类
定义一个全局键
final GlobalKey<ScaffoldState> _key = GlobalKey();
将这些添加到您的状态
类中
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Title'),
leading: IconButton(
icon: _isDrawerOpen ? Icon(Icons.menu) : Icon(Icons.arrow_back),
onPressed: onPressed,
),
),
drawer: WillPopScope(child: Drawer(), onWillPop: onPop),
body: //body
key: this._key,
);
}
void onPressed() {
if (!_isDrawerOpen) {
this._key.currentState.openDrawer();
} else {
Navigator.pop(context);
}
setState(() {
_isDrawerOpen = !_isDrawerOpen;
});
}
void onPop() {
if (_isDrawerOpen) {
setState(() {
_isDrawerOpen = false;
});
}
Navigator.pop(context);
}
要在抽屉打开时更改汉堡图标,并在应用程序栏下方显示抽屉,请执行以下操作: 我在代码中声明了“方法1”和“方法2”,它们都在注释中 “方法1”允许打开抽屉并通过抽屉控制器回调更改图标 “方法2”允许当我们点击汉堡图标时打开抽屉。问题是如果我们使用抽屉控制器时不能点击汉堡图标
导入“包装:颤振/材料.省道”;
类MyNavDroperController扩展StatefulWidget{
createState(){
返回StateKeeper();
}
}
类StateKeeper扩展状态{
//声明一个新变量,该变量将在FAB tap时递增
最终GlobalKey _scaffoldKey=新的GlobalKey();
最终appBarColor=常量颜色(0xFFd2527f);
var myIcon=新图标(Icons.list);
抽屉回拨抽屉回拨(布尔状态){
烤面包片(
消息:“抽屉”+状态.toString(),
烤面包片长度:烤面包片长度,
地心引力:ToastGravity.CENTER,
时间:1,
背景颜色:appBarColor,
textColor:Colors.white,
体积:14.0),;
设置状态(){
setMenuIcon(状态);
});
}
@凌驾
void initState(){
//TODO:实现initState
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
钥匙:_scaffoldKey,
小学:对,
appBar:appBar(
标题:文本(“父脚手架”),
前导:新图标按钮(图标:myIcon,
已按下:(){
_scaffoldKey.currentState.openDrawer();
}
)
),
//方法1
/*主体:抽屉控制器(
孩子:抽屉(
子:ListView(
填充:EdgeInsets.zero,
儿童:[
抽屉阅读器(
孩子:文本('Andy Rubin'),
装饰:盒子装饰(颜色:颜色。蓝色),
),
列表砖(
标题:文本(“主页”),
onTap:(){
设置状态(){
Navigator.pop(上下文);
});
},
),
列表砖(
标题:文本(“关于我们”),
onTap:(){
Navigator.pop(上下文);
烤面包片(
味精:“关于我们点击了!:)”,
烤面包片长度:烤面包片长度,
地心引力:ToastGravity.CENTER,
时间:1,
背景颜色:Colors.red,
textColor:Colors.white,
体积:16.0),;
},
),
列表砖(
标题:文本(“通知”),
onTap:(){
Navigator.pop(上下文);
烤面包片(
消息:“已点击通知!:)”,
烤面包片长度:烤面包片长度,
地心引力:ToastGravity.CENTER,
时间:1,
背景颜色:Colors.blue,
textColor:Colors.white,
体积:18.0),;
},
)
],
),
),
对齐:drawerignment.start,drawerCallback:drawerCallback
),*/
//方法2
/
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Title'),
leading: IconButton(
icon: _isDrawerOpen ? Icon(Icons.menu) : Icon(Icons.arrow_back),
onPressed: onPressed,
),
),
drawer: WillPopScope(child: Drawer(), onWillPop: onPop),
body: //body
key: this._key,
);
}
void onPressed() {
if (!_isDrawerOpen) {
this._key.currentState.openDrawer();
} else {
Navigator.pop(context);
}
setState(() {
_isDrawerOpen = !_isDrawerOpen;
});
}
void onPop() {
if (_isDrawerOpen) {
setState(() {
_isDrawerOpen = false;
});
}
Navigator.pop(context);
}
import 'package:flutter/material.dart';
class MyNavDrawerController extends StatefulWidget {
createState() {
return StateKeeper();
}
}
class StateKeeper extends State<MyNavDrawerController> {
// Declare a new variable which will increment on FAB tap
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
final appBarColor = const Color(0xFFd2527f);
var myIcon = new Icon(Icons.list);
DrawerCallback drawerCallback(bool status) {
Fluttertoast.showToast(
msg: "Drawer " + status.toString(),
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIos: 1,
backgroundColor: appBarColor,
textColor: Colors.white,
fontSize: 14.0);
setState(() {
setMenuIcon(status);
});
}
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
primary: true,
appBar: AppBar(
title: Text("Parent Scaffold"),
leading: new IconButton(icon: myIcon,
onPressed:(){
_scaffoldKey.currentState.openDrawer();
}
)
),
// METHOD 1
/*body: DrawerController(
child: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
DrawerHeader(
child: Text('Andy Rubin'),
decoration: BoxDecoration(color: Colors.blue),
),
ListTile(
title: Text('Home'),
onTap: () {
setState(() {
Navigator.pop(context);
});
},
),
ListTile(
title: Text('About us'),
onTap: () {
Navigator.pop(context);
Fluttertoast.showToast(
msg: "About us clicked! :)",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIos: 1,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 16.0);
},
),
ListTile(
title: Text('Notifications'),
onTap: () {
Navigator.pop(context);
Fluttertoast.showToast(
msg: "Notifications clicked! :)",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIos: 1,
backgroundColor: Colors.blue,
textColor: Colors.white,
fontSize: 18.0);
},
)
],
),
),
alignment: DrawerAlignment.start, drawerCallback: drawerCallback
),*/
// METHOD 2
/*body: Scaffold(
key: _scaffoldKey,
drawer: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
DrawerHeader(
child: Text('Andy Rubin'),
decoration: BoxDecoration(color: Colors.blue),
),
ListTile(
title: Text('Home'),
onTap: () {
Fluttertoast.showToast(
msg: "Home clicked! :)",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIos: 1,
backgroundColor: appBarColor,
textColor: Colors.white,
fontSize: 14.0);
setState(() {
Navigator.pop(context);
});
},
),
ListTile(
title: Text('About us'),
onTap: () {
Navigator.pop(context);
Fluttertoast.showToast(
msg: "About us clicked! :)",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIos: 1,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 16.0);
},
),
ListTile(
title: Text('Notifications'),
onTap: () {
Navigator.pop(context);
Fluttertoast.showToast(
msg: "Notifications clicked! :)",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIos: 1,
backgroundColor: Colors.blue,
textColor: Colors.white,
fontSize: 18.0);
},
)
],
),
),
)*/
);
}
void setMenuIcon(bool isDrawerOpen){
if(isDrawerOpen){
myIcon = new Icon(Icons.list);
}else{
myIcon = new Icon(Icons.arrow_back);
}
}
}
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0.0,
leading: Builder(
builder: (context) => IconButton(
icon: Icon(
Icons.sort,
color: Colors.black54,
),
onPressed: () => Scaffold.of(context).openDrawer(),
tooltip:
MaterialLocalizations.of(context).openAppDrawerTooltip,
)),
),
drawer: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
DrawerHeader(
decoration: BoxDecoration(
color: Colors.blue,
),
child: Text('App'),
),
ListTile(
title: Text('Item 1'),
onTap: () {
Navigator.pop(context);
},
),
ListTile(
title: Text('Item 2'),
onTap: () {
Navigator.pop(context);
},
),
],
),
),)