firebase - 在flutter firebase中调用了方法'[]'的空错误
问题描述
我正在使用firebase firestore制作个人资料页面,但没有收到此类方法错误,方法'[]'在null上调用并尝试调用:。下面是我命名为“Kisi”的用户类
class Kisi {
final String username,uid,email,photoUrl,name,surname;
Kisi({this.username,this.uid,this.email,this.name,this.photoUrl,this.surname});
factory Kisi.fromDocument(DocumentSnapshot doc)
{
return Kisi(
uid: doc.data()['uid'],
username: doc.data()['username'],
name: doc.data()['name'],
photoUrl: doc.data()['photoURL'],
surname: doc.data()['surname']
);
}
}
我在调用 FirebaseFirestore 的构建方法中的以下类中遇到错误。
在构建 StreamBuilder(dirty, state: _StreamBuilderBaseState<DocumentSnapshot, AsyncSnapshot>#6be47) 时引发了以下 NoSuchMethodError:在 null 上调用了方法“[]”。接收者:null 尝试调用:
class MyAccount extends StatefulWidget {
@override
_MyAccountState createState() => _MyAccountState();
}
class _MyAccountState extends State<MyAccount> {
FirebaseAuth firebaseAuth = FirebaseAuth.instance;
User currentUser;
@override
void initState() {
super.initState();
_loadCurrentUser();
}
void _loadCurrentUser() {
firebaseAuth.authStateChanges().listen((User user) {
setState(() {
this.currentUser = user;
});
});
}
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: FirebaseFirestore.instance
.collection('Users')
.doc(currentUser.uid.toString())
.snapshots(),
builder: (context, snapshot) {
Kisi user = Kisi.fromDocument(snapshot.data);
return Scaffold(
appBar: AppBar(
elevation: 0,
),
body: Padding(
padding: const EdgeInsets.all(15.0),
child: ListView(
children: <Widget>[
Container(
child: Text(
"Giriş ve Güvenlik",
style:
TextStyle(fontSize: 28.0, fontWeight: FontWeight.bold),
),
),
Card(
child: Column(
children: <Widget>[
Container(
child: Text(
"İsim:",
style: TextStyle(fontWeight: FontWeight.bold),), ),
Container(
child: Text(
user.name),
),
],
),
),
],
),
),
);
},
);
}
}
解决方案
StreamBuilder
是异步的,因此获取数据需要时间。您需要执行以下操作:
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: FirebaseFirestore.instance
.collection('Users')
.doc(currentUser.uid.toString())
.snapshots(),
builder: (context, snapshot) {
if(snapshot.hasData){
Kisi user = Kisi.fromDocument(snapshot.data);
return Scaffold(
appBar: AppBar(
elevation: 0,
),
body: Padding(
padding: const EdgeInsets.all(15.0),
child: ListView(
children: <Widget>[
Container(
child: Text(
"Giriş ve Güvenlik",
style:
TextStyle(fontSize: 28.0, fontWeight: FontWeight.bold),
),
),
Card(
child: Column(
children: <Widget>[
Container(
child: Text(
"İsim:",
style: TextStyle(fontWeight: FontWeight.bold),), ),
Container(
child: Text(
user.name),
),
],
),
),
],
),
),
);
},
else {
return CircularProgressIndicator();
}
},
);
}
添加一个条件,circularprogressindicator
当数据仍未获取时将显示一个。
推荐阅读
- powershell - Powershell 强制将 ConvertFrom-Json 输出转换为字符串,然后可以将其用于所有字符串操作,包括。文件命名
- javascript - 我们如何在javascript中编写క్ష(泰卢固语)unicode(结合“ka”和“sha”字形)?
- javascript - React 有条件地在特定路由中渲染组件
- c++ - 如何使用 std::reduce 将 Windows 上的线程亲和性设置为最大值
- node.js - 使用 Google Sheets Node.js API 更新单元格颜色
- javascript - 如何通过新集合从对象中获取唯一数组?
- sql - 双管做字符串比较?
- javascript - 输入特定文本时,Javascript 输入会运行一个函数
- pytorch - Pytorch:如何创建一个随机整数张量,其中某个百分比具有某个值?例如,25% 为 1,其余为 0
- google-bigquery - BigQuery - 替换字符串中的空格