【问题标题】:Flutter Widgets Accessing Null Provider ObjectFlutter Widgets 访问 Null Provider 对象
【发布时间】:2020-08-24 21:51:21
【问题描述】:

我正在开发我的第一个 Flutter 应用程序,但在使用 Provider 管理应用程序状态的方法上遇到了困难。我已经简化了一些事情,但最重要的是我有一个 AppModel 类,其中包含一个用户令牌,一旦通过身份验证,他们将在发出 API 请求时使用该用户令牌,以及他们当前的“团队”选择。

class AppModel extends ChangeNotifier {
  Team _team;
  Team get currentTeam => _team;

  String _userToken;
  String get userToken => _userToken;

  void setUser({String token, Team team}) {
    _userToken = token;
    _team = team;
    notifyListeners();
  }

  void exitTeam() {
    _team = null;
    notifyListeners();
  }
}

用户可以定位到一些主要位置。如果他们的 userToken 为空,他们应该被带到登录页面。如果他们有一个 userToken,但 currentTeam 为空,他们应该在团队选择屏幕上。如果他们有一个团队,他们就在一组页面中,他们可以从“TeamHomePage”小部件开始管理该团队。在顶层,我有以下小部件构建功能:

  @override
  Widget build(BuildContext context) {
    return Consumer<AppModel>(
        builder: (context, model, _) => (model?.userToken?.isEmpty ?? true
            ? LoginScreen()
            : (model.currentTeam == null
                ? SelectTeamWidget(userToken: model.userToken)
                : TeamHomeWidget())));
  }

在 TeamHomeWidget 中,还有其他页面是 AppModel 的消费者,它们查看 currentTeam 属性。在其中,有退出当前团队的选项,以便他们可以选择不同的团队。为此,我在 AppModel 中调用了 exitTeam 函数:

Provider.of<AppModel>(context, listen: false).exitTeam();

这几乎可以按预期工作。从 TeamHomeWidget 调用 exitTeam 时,它可以工作。但是,当我在链接出 TeamHomeWidget 且也是 AppModel 消费者的任何其他页面上时,我会遇到与 currentTeam 现在为空的事实相关的崩溃。但是,我打算不再呈现这些页面,因为它们应该被带回 SelectTeamWidget。这种做法不正确吗?

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案1】:

    由于您的 TeamHomeWidget 也被 Consumer 包裹 并使用 currentTeam 做某事。这个 Consumer 也在监听 AppModel 的变化,如果这个 Consumer 的触发比你的顶级 Consumer Widget,那么你的应用就会崩溃。

    为防止这种情况,请将顶层的值分配给 TeamHomeWidget

     @override
      Widget build(BuildContext context) {
        return Consumer<AppModel>(
            builder: (context, model, _) => (model?.userToken?.isEmpty ?? true
                ? LoginScreen()
                : (model.currentTeam == null
                    ? SelectTeamWidget(userToken: model.userToken)
                    : TeamHomeWidget(team: model.currentTeam))));
      }
    

    【讨论】:

    • 这对让我更好地了解我的应用程序中发生的事情非常有帮助。最终,当我导航到其他路线时,我所做的就是完全从小部件树中替换具有消费者逻辑的路线。我在团队上下文路由中添加了一个导航器,以便此小部件始终位于顶层并解决了该问题。干杯!
    猜你喜欢
    • 2021-12-15
    • 2021-06-07
    • 2020-12-28
    • 2020-06-01
    • 2020-11-03
    • 2020-11-29
    • 2021-04-12
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多