【问题标题】:The getter was called on null but the widgets still builds fine在 null 上调用了 getter,但小部件仍然可以正常构建
【发布时间】:2020-06-18 07:34:30
【问题描述】:

我正在尝试实现 Provider 而不是使用 State,所以在阅读了一些对我来说有点难以理解的教程之后,因为我没有找到明确的说法:“你将使用 Firebase,然后在这里你应该使用 ChangeNotifierProvider 或 Provider 或 StreamProvider 等。”

因此,我在 Fireship 找到了 Jeff Delaney 的教程,我尝试将其应用于我的用例,但尽管它有效,但我不确定我是否做得正确,主要是因为我收到这条消息说“调用了 getter空值”。我可以通过输入“?”来抑制它。像 user?.name 但我想了解发生了什么以及为什么尽管出现错误代码仍然可以正常工作。

这是我的代码: 首先,我有一个普通的用户模型,它可以很好地创建模型并从 Firebase 返回名称、tlf 和其他内容。这部分没问题。 然后我从 Jeff 的代码中得到了这个数据库服务:

class DatabaseService {
  final Firestore _db = Firestore.instance;

  /// Get a stream of a single document
  Stream<User> streamUser (String id) {
    return _db
        .collection('profiles')
        .document(id)
        .snapshots()
        .map((snap) => User.fromMap(snap.data));
  }
  }

然后是我实现提供程序的屏幕:

class GestorScreen extends StatelessWidget {
  final db = DatabaseService();
  final FirebaseUser firebaseUser;
  GestorScreen({Key key, @required this.firebaseUser});

  @override
  Widget build(BuildContext context) {    
         return StreamProvider<User>.value(
              value: db.streamUser(firebaseUser.uid),
            child: DashboardButtons(),
          );
  }
}

还有 DashboardButtons 类:

class DashboardButtons extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var user = Provider.of<User>(context);
    return Scaffold(
      appBar: AppBar(),
      body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              user?.updated != null ? _button(CustomColors.emerald, () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) =>
                        Dashboard(user: user)));
              }, 'Gestionar Perfil') : _button(CustomColors.emerald, () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) =>
                        UserAlta(user: user,)));
              }, ' Dar de Alta (ßeta)'),
              SizedBox(height: SizeConfig.blockSizeHorizontal * 7,),
             .................
             .................
             .................
            ],
          )

      ),
      backgroundColor: CustomColors.newCreme,
    )
  }
}

代码工作正常,但如果删除“?”来自 user.updated 它说在 null 上调用了 getter 'updated'... 仍然可以正常工作。

有人可以帮我解决这个问题吗?吸气剂的问题在哪里?我是否以正确的方式实现了 Provider?

【问题讨论】:

    标签: flutter dart flutter-provider


    【解决方案1】:

    user 为空时获取错误。

    user?.updated 等于 user == null ? null : user.updated

    【讨论】:

    • 好吧,我知道我可能不清楚:我知道您是否相信用户应该为空的警告,这就是为什么我放置了安全运算符但事实并非如此!它不为空,这就是代码工作正常的原因。尽管消息说 getter 为空..
    • 因为第一个流值为null。
    • 我认为使用StreamBuilder 比使用Provider 更好。
    【解决方案2】:

    它是一个安全的导航运算符,当用户对象为空时,整个表达式返回空。否则运行 updated() 方法。

    safe navigation operator

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 2019-09-23
      • 1970-01-01
      • 2021-12-21
      • 2020-01-10
      • 2020-10-24
      • 2021-04-13
      • 2021-10-22
      相关资源
      最近更新 更多