【发布时间】: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