【问题标题】:Flutter reuse state from StatefulWidget on rebuild在重建时 Flutter 重用 StatefulWidget 的状态
【发布时间】:2020-12-18 20:16:55
【问题描述】:

简而言之,问题是:如何重用整个小部件子树的状态?


这是我的代码目前的样子:

...
BlocBuilder<AuthBloc, AuthState>(
  builder: (context, state) {
    if (state is Authenticating) {
      return AppLoading();
    } else if (state is NotAuthenticated) {
      return AppOnboarding();
    } else if (state is Authenticated) {
      return AppMain();
    } else {
      return null;
    }
  }
),
...

这里没什么特别的,只是一个 BlocBuilder 在底层 Bloc 的状态发生变化时重建它的子节点。

现在,以以下状态转换为例:NotAuthenticated =&gt; Authenticating =&gt; NotAuthenticated,因为输入的信息有问题。这将导致 AppOnboarding() 小部件从头开始完全重建,所有信息都丢失了。如何重用旧 AppOnboarding() 小部件的状态,使其看起来像从未重建过的小部件?


我已经尝试过的

我已经尝试过为此使用GlobalKey,我会将其传递给我的 AppOnboarding 小部件的 key 属性。这是我的代码:

_AuthenticatingState extends State<Authenticating> {
  GlobalKey<AppOnboardingState> _appOnboardingKey;

  @override
  initState() {
    super.initState();
    _appOnboardingKey = GlobalKey();
  }

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<...>(
      builder: (context, state) {
        ...
        if (state is NotAuthenticated) {
          return AppOnboarding(key: _appOnboardingKey);
        }
        ...
      }
    ),
  }
}

我有点惊讶这不起作用。全局键不维护条目小部件子树的状态吗?

【问题讨论】:

    标签: flutter state bloc state-management statefulwidget


    【解决方案1】:

    Flutter 以每秒 60 帧的速度运行。该键告诉 Flutter 某些小部件与上一帧中存在的小部件相同。如果您删除了一些小部件,即使是单个框架,它也会释放小部件(调用 dispose 方法并删除小部件)。

    换句话说,密钥不会“保存”任何状态以供以后使用。

    你有两个选择:

    1. 根本不丢弃小部件。
    builder: (context, state) {
        return Stack(children: [
        Offstage(child:AppLoading(), offstage: state is! Authenticating),
        Offstage(child:AppOnboarding()), offstage: state is! NotAuthenticated),
        Offstage(child:AppMain()), offstage: state is! Authenticated),
        ]) }
      }
    
    1. 保存自己的小部件状态,以便您以后可以使用相同的信息重建小部件。

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 2019-10-09
      • 2021-02-27
      • 2020-03-11
      • 2021-08-18
      • 1970-01-01
      • 2018-12-21
      • 2020-10-13
      • 1970-01-01
      相关资源
      最近更新 更多