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);
            },
          ),
        ],
      ),
    ),)