如何在颤动中更改抽屉图标?

Posted

技术标签:

【中文标题】如何在颤动中更改抽屉图标?【英文标题】:How can I change Drawer icon in flutter? 【发布时间】:2020-04-20 14:06:23 【问题描述】:

抽屉有这个默认的三个水平条作为默认图标,但我想将其更改为其他东西。 我已经检查了Drawer() 下的可能选项,但似乎没有附加任何属性。

【问题讨论】:

【参考方案1】:

这应该可行。

Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title:Text('hi'),
        leading: IconButton(
          icon: Icon(Icons.accessible),
          onPressed: () => Scaffold.of(context).openDrawer(),
        ),
      ),
);

来自文档 ->

Widget 前导 类型:Widget 在 [title] 之前显示的小部件。 如果这是 null 并且 [automaticallyImplyLeading] 设置为 true,则 [AppBar] 将暗示一个适当的小部件。例如,如果 [AppBar] 位于还具有 [Drawer] 的 [Scaffold] 中,则 [Scaffold] 将使用打开抽屉的 [IconButton] 填充此小部件(使用 [Icons.menu])。如果没有 [Drawer] 并且父 [Navigator] 可以返回,则 [AppBar] 将使用调用 [Navigator.maybePop] 的 [BackButton]。 以下代码展示了如何手动指定抽屉按钮而不是依赖 [automaticallyImplyLeading]:

import 'package:flutter/material.dart';
Widget build(context) 
  return AppBar(
    leading: Builder(
      builder: (BuildContext context) 
        return IconButton(
          icon: const Icon(Icons.menu),
          onPressed: () 
            Scaffold.of(context).openDrawer();
          ,
          tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
        );
      ,
    ),
  );

此示例中使用 [Builder] 以确保上下文引用子树的该部分。这样,这个代码 sn-p 甚至可以在创建 [Scaffold] 的代码中使用(在这种情况下,如果没有 [Builder],上下文将无法看到 [Scaffold],因为它会引用该小部件的祖先)。

【讨论】:

在我的情况下,我得到“处理手势时抛出了以下断言:使用不包含脚手架的上下文调用 Scaffold.of()。找不到脚手架祖先从传递给 Scaffold.of() 的上下文。这通常发生在提供的上下文来自与其构建函数实际创建正在寻找的 Scaffold 小部件相同的 StatefulWidget 时。" 参考答案第二部分@vinodyadav【参考方案2】:
appBar: AppBar(
        leading: Builder(
          builder: (context) => IconButton(
            icon: Icon(Icons.menu_rounded),
            onPressed: () => Scaffold.of(context).openDrawer(),
          ),
        ),
        title: Text(
          "Track your Shipment",
        ),
      ),

【讨论】:

【参考方案3】:

您也可以使用这样的自定义按钮打开抽屉。 创建这个脚手架键。

var scaffoldKey = GlobalKey<ScaffoldState>();

现在像这样在你的状态类中添加一个脚手架

      @override
  Widget build(BuildContext context) 
    return Scaffold(
      key: scaffoldKey,
      drawer: Drawer(
        child: Text('create drawer widget tree here'),
      ),
      appBar: AppBar(
        backgroundColor: Colors.white,
        title: Text(
          'appName',
          style: Theme.of(context).textTheme.headline2,
        ),
        leading: IconButton(
          onPressed: () 
            scaffoldKey.currentState?.openDrawer();
          ,
          icon: Image.asset(
            'assets/images/menu.png',
            fit: BoxFit.cover,
          ),
        ),
      ),
      body: Container(),
    );
  

【讨论】:

【参考方案4】:

假设您有:index.dart(您要在其中使用应用栏)、drawer.dart(您的抽屉或导航菜单)和 appbar.dart(您的应用栏)

你可以在抽屉里这样做:

Widget drawer(BuildContext context) 
    return Drawer(
child: ListView(
  padding: EdgeInsets.zero,
  children: <Widget>[
    Container(
        ...
    )
);

然后你的 appbar.dart:

class CustomAppBar extends StatelessWidget implements PreferredSizeWidget 
  @override
  Widget build(BuildContext context) 
    return AppBar(
      backgroundColor: Colors.white,
      leading: InkWell(
        onTap: () => Scaffold.of(context).openDrawer(),
        child: Image.asset("assets/images/imgAppBar.png"),
      ),
     title: Container(...

然后你的 index.dart:

@override
Widget build(BuildContext context) 
    return Scaffold(
      backgroundColor: Colors.white,
      drawer: drawer(context),
      appBar: CustomAppBar(),
    ...

这只是一个简单的。如果您想使用图标等,可以使用 IconButton。

【讨论】:

【参考方案5】:

实际上,我尝试了 cmd_prompter 的答案,但它对我不起作用。

描述了更好的方法here

我的工作代码在这里:

return DefaultTabController(
      key: Key("homePage"),
      length: 2,
      child: Scaffold(
          endDrawer: Drawer(

        ),
          appBar: AppBar(
            leading: BackButton(
                onPressed: () 
                  ,
              ),
            title: Text(profile.selectedCity!),
            actions: [
              Padding(
                padding: EdgeInsets.symmetric(horizontal: baseUnit(3)),
                child: Builder(
                  builder: (context) => IconButton(
                      icon: Icon(Icons.account_circle),
                      onPressed: () => Scaffold.of(context).openEndDrawer(),
                    )
                )
              )

它对我来说很好——尤其是关于使用 Builder 的部分。这很重要 - 否则它对我不起作用。

【讨论】:

【参考方案6】:
class HomeOne extends StatefulWidget  const HomeOne(Key? key) : super(key: key);

@override State createState() =>HomeOneState(); 

var scaffoldKey = GlobalKey();

class HomeOneState extends State  @override Widget build(BuildContext context)  var theme = Theme.of(context); return Directionality( textDirection: TextDirection.rtl, child: Scaffold( key: scaffoldKey, drawerEnableOpenDragGesture: true, // drawerScrimColor: Colors.red, appBar: AppBar( leading: IconButton( onPressed: () => scaffoldKey.currentState?.openDrawer(), icon: const Icon( Icons.add, color: Colors.red, )), ),

【讨论】:

不接受纯代码答案。请改进。阅读***.com/help/how-to-answer 获取信息。【参考方案7】:
AppBar(
        leading: IconButton(
          onPressed: () 
            // Code
          ,
          icon: Icon(Icons.arrow_back),
        ),
      ),

【讨论】:

【参考方案8】:

要只更改图标颜色,adding an iconTheme to the AppBar 更容易做到:

@override
Widget build(BuildContext context) 
  return Scaffold(
    drawer: Drawer(),
    appBar: AppBar(
      title: Text("Navigation Drawer"),
      iconTheme: IconThemeData(color: Colors.green),
    ),
  );

【讨论】:

【参考方案9】:

您需要创建 ScaffoldKey 类型的全局键,用于打开抽屉并更改图标:

    Widget build(BuildContext context) 
    var scaffoldKey = GlobalKey<ScaffoldState>();
    return Scaffold(
      key: scaffoldKey,
      appBar: AppBar(
        title:Text('hi'),
        leading: IconButton(
          icon: Icon(Icons.accessible),
          onPressed: () => scafoldKey.currentState.openDrawer(),
        ),
      ),
    );

【讨论】:

以上是关于如何在颤动中更改抽屉图标?的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动的底部导航栏中添加抽屉?

更改 Scaffold.body 值后如何在颤动中隐藏抽屉

尝试使用个人资料图像创建导航抽屉作为颤动中的图标

如何在 Android 中更改汉堡图标(导航抽屉)

如何在颤动中更改特定的图标颜色?

如何更改材料设计导航抽屉中汉堡图标的颜色