【问题标题】:Duplicate GlobalKey with custom scaffold in flutter在颤动中使用自定义脚手架复制 GlobalKey
【发布时间】:2019-05-25 22:50:52
【问题描述】:

我正在尝试根据这个 github 问题在 Flutter 中实现自定义脚手架:https://github.com/flutter/flutter/issues/19606

import 'package:flutter/material.dart';

class MyCustomScaffold extends Scaffold {
  static GlobalKey<ScaffoldState> _keyScaffold = GlobalKey();

  MyCustomScaffold({
    AppBar appBar,
    Widget body,
    Widget floatingActionButton,
    FloatingActionButtonLocation floatingActionButtonLocation,
    FloatingActionButtonAnimator floatingActionButtonAnimator,
    List<Widget> persistentFooterButtons,
    Widget drawer,
    Widget endDrawer,
    Widget bottomNavigationBar,
    Widget bottomSheet,
    Color backgroundColor,
    bool resizeToAvoidBottomPadding = true,
    bool primary = true,
  }) : super(
          key: _keyScaffold,
          appBar: endDrawer != null &&
                  appBar.actions != null &&
                  appBar.actions.isNotEmpty
              ? _buildEndDrawerButton(appBar)
              : appBar,
          body: body,
          floatingActionButton: floatingActionButton,
          floatingActionButtonLocation: floatingActionButtonLocation,
          floatingActionButtonAnimator: floatingActionButtonAnimator,
          persistentFooterButtons: persistentFooterButtons,
          drawer: drawer,
          endDrawer: endDrawer,
          bottomNavigationBar: bottomNavigationBar,
          bottomSheet: bottomSheet,
          backgroundColor: backgroundColor,
          resizeToAvoidBottomPadding: resizeToAvoidBottomPadding,
          primary: primary,
        );

  static AppBar _buildEndDrawerButton(AppBar myAppBar) {
    myAppBar.actions.add(IconButton(
        icon: Icon(Icons.menu),
        onPressed: () => !_keyScaffold.currentState.isEndDrawerOpen
            ? _keyScaffold.currentState.openEndDrawer()
            : null));
    return myAppBar;
  }
}

代码本身可以正常工作。但是,如果我使用其他 GlobalKey 在屏幕之间导航,则会出现 Duplicate GlobalKey 的错误。

如何避免这种情况?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    尝试这些更改以避免使用静态时出现问题。

        class MyCustomScaffold extends Scaffold {
          MyCustomScaffold({
            AppBar appBar,
            Widget body,
            GlobalKey<ScaffoldState> key,
            Widget floatingActionButton,
            FloatingActionButtonLocation floatingActionButtonLocation,
            FloatingActionButtonAnimator floatingActionButtonAnimator,
            List<Widget> persistentFooterButtons,
            Widget drawer,
            Widget endDrawer,
            Widget bottomNavigationBar,
            Widget bottomSheet,
            Color backgroundColor,
            bool resizeToAvoidBottomPadding = true,
            bool primary = true,
          })  : assert(key != null),
                super(
                  key: key,
                  appBar: endDrawer != null &&
                          appBar.actions != null &&
                          appBar.actions.isNotEmpty
                      ? _buildEndDrawerButton(appBar, key)
                      : appBar,
                  body: body,
                  floatingActionButton: floatingActionButton,
                  floatingActionButtonLocation: floatingActionButtonLocation,
                  floatingActionButtonAnimator: floatingActionButtonAnimator,
                  persistentFooterButtons: persistentFooterButtons,
                  drawer: drawer,
                  endDrawer: endDrawer,
                  bottomNavigationBar: bottomNavigationBar,
                  bottomSheet: bottomSheet,
                  backgroundColor: backgroundColor,
                  resizeToAvoidBottomPadding: resizeToAvoidBottomPadding,
                  primary: primary,
                );
    
          static AppBar _buildEndDrawerButton(
              AppBar myAppBar, GlobalKey<ScaffoldState> _keyScaffold) {
            myAppBar.actions.add(IconButton(
                icon: Icon(Icons.menu),
                onPressed: () => !_keyScaffold.currentState.isEndDrawerOpen
                    ? _keyScaffold.currentState.openEndDrawer()
                    : null));
            return myAppBar;
          }
        }
    

    并像这样使用:

      class YourWidget extends StatelessWidget {
    
        GlobalKey<ScaffoldState> _key = GlobalKey();
    
        @override
        Widget build(BuildContext context) {
          return MyCustomScaffold(
              endDrawer: Drawer(),
              key: _key,
              appBar: AppBar(
              ...
    

    【讨论】:

    • 请解释你做了什么而不是粘贴代码。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 2012-10-25
    • 2020-05-16
    • 2021-09-02
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多