在Flutter中,使用自定义Scaffold时遇到了重复的GlobalKey问题

4

我正在尝试按照这个Github issue实现自定义脚手架: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的屏幕之间导航,就会出现“重复的GlobalKey”错误。

我该如何避免这种情况?

1个回答

5

尝试以下几个更改以避免使用静态的问题。

    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(
          ...

1
请解释您所做的事情,而不是粘贴代码。谢谢。 - ibrahim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接