由于空安全 (DART/FLUTTER),Firebase 不工作
Firebase doesn't work cause of null-safety (DART/FLUTTER)
我 using/learning Firebase 用于我的数据库工作。我的快照就像 _jsonQuerySnapshot 或 _jsonDocumentSnapshot 一样。但它必须是 QuerySnapshot 或 DocumentSnapshot。因此,我必须对我的快照进行编码和解码才能使用我的数据。
如果我不使用 encode decode json,我会一直收到 null 或对象错误。
这是我的 class 从 state
延伸
class _MyHomePageState extends State<MyHomePage> {
final _firestore = FirebaseFirestore.instance;
@override
Widget build(BuildContext context) {
CollectionReference moviesRef=_firestore.collection('movies');
DocumentReference babaRef = _firestore.collection('movies').doc('Baba');
return Scaffold(
backgroundColor: Colors.grey,
appBar: AppBar(
title: Text('FireStore Crud'),
),
body: Center(
child: Container(
child: Column(
children: [
StreamBuilder<QuerySnapshot>(
stream: moviesRef.snapshots(),
builder: (BuildContext context,AsyncSnapshot asyncSnapshot){
List<DocumentSnapshot>listOfDocumentSnapshot=asyncSnapshot.data.docs;
return Flexible(
child: ListView.builder(
itemCount: listOfDocumentSnapshot.length,
itemBuilder: (context,index){
Text('${listOfDocumentSnapshot[index].data()['name']}' ,style: TextStyle(fontSize: 24),);
},
),
);
},
),
],
),
),
),
);
}
}
这是我的错误。
首先,检查您的数据是否为空,然后在其上使用 []
。可能 listOfDocumentSnapshot[index].data()
为空。如果为 null,则渲染另一个 UI,例如加载屏幕。即,您的加载屏幕必须显示直到到达数据。
例如:
builder: (BuildContext context,AsyncSnapshot asyncSnapshot){
List<DocumentSnapshot>? listOfDocumentSnapshot = asyncSnapshot.data.docs;
if(!listOfDocumentSnapshot.hasData || listOfDocumentSnapshot == null){
return LoadingScreen(); //etc.
}
return Flexible(
child: ListView.builder(
itemCount: listOfDocumentSnapshot.length,
itemBuilder: (context,index){
Text('${listOfDocumentSnapshot[index].data()['name']}' ,style: TextStyle(fontSize: 24),);
},
),
);
},
Futures(异步程序)需要一些时间来获取数据,你必须让你的 UI 等到你获取数据。例如数据库连接,read/write 某事 to/from 某处等
有关详细信息,您可以阅读 this article。
我 using/learning Firebase 用于我的数据库工作。我的快照就像 _jsonQuerySnapshot 或 _jsonDocumentSnapshot 一样。但它必须是 QuerySnapshot 或 DocumentSnapshot。因此,我必须对我的快照进行编码和解码才能使用我的数据。 如果我不使用 encode decode json,我会一直收到 null 或对象错误。 这是我的 class 从 state
延伸
class _MyHomePageState extends State<MyHomePage> {
final _firestore = FirebaseFirestore.instance;
@override
Widget build(BuildContext context) {
CollectionReference moviesRef=_firestore.collection('movies');
DocumentReference babaRef = _firestore.collection('movies').doc('Baba');
return Scaffold(
backgroundColor: Colors.grey,
appBar: AppBar(
title: Text('FireStore Crud'),
),
body: Center(
child: Container(
child: Column(
children: [
StreamBuilder<QuerySnapshot>(
stream: moviesRef.snapshots(),
builder: (BuildContext context,AsyncSnapshot asyncSnapshot){
List<DocumentSnapshot>listOfDocumentSnapshot=asyncSnapshot.data.docs;
return Flexible(
child: ListView.builder(
itemCount: listOfDocumentSnapshot.length,
itemBuilder: (context,index){
Text('${listOfDocumentSnapshot[index].data()['name']}' ,style: TextStyle(fontSize: 24),);
},
),
);
},
),
],
),
),
),
);
}
}
这是我的错误。
首先,检查您的数据是否为空,然后在其上使用 []
。可能 listOfDocumentSnapshot[index].data()
为空。如果为 null,则渲染另一个 UI,例如加载屏幕。即,您的加载屏幕必须显示直到到达数据。
例如:
builder: (BuildContext context,AsyncSnapshot asyncSnapshot){
List<DocumentSnapshot>? listOfDocumentSnapshot = asyncSnapshot.data.docs;
if(!listOfDocumentSnapshot.hasData || listOfDocumentSnapshot == null){
return LoadingScreen(); //etc.
}
return Flexible(
child: ListView.builder(
itemCount: listOfDocumentSnapshot.length,
itemBuilder: (context,index){
Text('${listOfDocumentSnapshot[index].data()['name']}' ,style: TextStyle(fontSize: 24),);
},
),
);
},
Futures(异步程序)需要一些时间来获取数据,你必须让你的 UI 等到你获取数据。例如数据库连接,read/write 某事 to/from 某处等
有关详细信息,您可以阅读 this article。