çet*_*kış 25 dart firebase flutter google-cloud-firestore dart-null-safety
我是颤振新手。我正在尝试开发一个应用程序。
\n我想显示 Firebase 数据库中的人员列表。但是,我收到以下错误。
\n错误 :
\n\n\n无法无条件调用方法“[]”,因为接收者\n可能为“null”。尝试使调用成为有条件的(使用“?.”)或向目标添加空检查(“!”)。
\n
科德拉\xc4\xb1m :
\n`import 'package:calendar/page/mainPage.dart';\nimport 'package:flutter/material.dart';\nimport 'package:cloud_firestore/cloud_firestore.dart';\n\nclass Staff extends StatefulWidget {\n @override\n _StaffState createState() => _StaffState();\n}\n\nclass _StaffState extends State<Staff> {\n \n final _firestore = FirebaseFirestore.instance;\n\n @override\n Widget build(BuildContext context) {\n // ignore: unused_local_variable\n CollectionReference staffRef = _firestore.collection('staff');\n\n return Scaffold(\n appBar: AppBar(\n title: Text("Personel Listesi"),\n backgroundColor: Colors.redAccent[400],\n actions: <Widget>[\n IconButton(\n icon: Icon(Icons.home),\n onPressed: () {\n Navigator.pushAndRemoveUntil(\n context,\n MaterialPageRoute(builder: (_) => MainPage()),\n (route) => true);\n },\n ),\n ],\n ),\n body: Container(\n child: Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(\n child: Column(\n children: [\n StreamBuilder<QuerySnapshot>(\n stream: staffRef.snapshots(),\n builder: (BuildContext context, AsyncSnapshot asyncSnapshot) {\n if (asyncSnapshot.hasError) {\n return Center(\n child: Text(\n "Bir hata olu\xc5\x9ftu, l\xc3\xbctfen tekrar deneyiniz."));\n } else {\n if (asyncSnapshot.hasData) {\n List<DocumentSnapshot> listStaff =\n asyncSnapshot.data.docs;\n return Flexible(\n child: ListView.builder(\n itemBuilder: (context, index) {\n return Card(\n elevation: 20,\n color: Colors.greenAccent[200],\n child: ListTile(\n trailing: IconButton(\n icon: Icon(Icons.delete),\n onPressed: () async {\n await listStaff[index]\n .reference\n .delete();\n },\n ),\n title: Text(\n '${listStaff[index].data['nameSurname']}',\n style: TextStyle(fontSize: 20),\n ),\n subtitle: Column(\n children: [\n Row(\n mainAxisAlignment:\n MainAxisAlignment.start,\n children: [\n Text(\n '${listStaff[index].data['tip']}',\n style: TextStyle(fontSize: 14),\n ),\n ],\n ),\n Row(\n mainAxisAlignment:\n MainAxisAlignment.start,\n children: [\n Text(\n '${listStaff[index].data['mail']}',\n style: TextStyle(fontSize: 14),\n ),\n ],\n ),\n Row(\n mainAxisAlignment:\n MainAxisAlignment.start,\n children: [\n Text(\n '${listStaff[index].data['phone']}',\n style: TextStyle(fontSize: 14),\n ),\n ],\n ),\n ],\n ),\n ),\n );\n },\n itemCount: listStaff.length),\n );\n } else {\n return Center(\n child: CircularProgressIndicator(),\n );\n }\n }\n },\n ),\n ],\n ),\n ),\n ),\n ),\n );\n }\n}\n`\nRun Code Online (Sandbox Code Playgroud)\n
çet*_*kış 20
在新的flutter更新中,我们不需要添加.data()
我的代码如下
title: Text(
**'${listStaff[index].data['nameSurname']}',**
style: TextStyle(fontSize: 20),
),
Run Code Online (Sandbox Code Playgroud)
像这样更改它修复了错误。
title: Text(
**'${listPersonel[index]['nameSurname']}'**,
style: TextStyle(fontSize: 20),
),
Run Code Online (Sandbox Code Playgroud)
Cop*_*oad 17
List如果您访问可为 null或 的元素,则会出现此错误Map。让我们了解一下 a List,您可以将相同的解决方案应用于您的Map.
例如:
List<int>? someList;
void main() {
int a = someList[0]; // Error
}
Run Code Online (Sandbox Code Playgroud)
使用局部变量:
var list = someList;
if (list != null) {
int a = list[0]; // No error
}
Run Code Online (Sandbox Code Playgroud)
使用?和??:
int a = someList?[0] ?? -1; // -1 is the default value if List was null
Run Code Online (Sandbox Code Playgroud)
!仅当您确定不是时才List使用bang运算符null。
int a = someList![0];
Run Code Online (Sandbox Code Playgroud)
FutureBuilder/的人StreamBuilder:您可以通过两种方式解决该错误:
FutureBuilder为您的/指定一个类型StreamBuilder
FutureBuilder<List<int>>( // <-- type 'List<int>' is specified.
future: _listOfInt(),
builder: (_, snapshot) {
if (snapshot.hasData) {
List<int> myList = snapshot.data!; // <-- Your data
}
return Container();
},
)
Run Code Online (Sandbox Code Playgroud)
用于as向下转换Object为您的类型,例如 aList或Map。
FutureBuilder(
future: _listOfInt(),
builder: (_, snapshot) {
if (snapshot.hasData) {
var myList = snapshot.data! as List<int>; // <-- Your data using 'as'
}
return Container();
},
)
Run Code Online (Sandbox Code Playgroud)
这是一个典型的空安全相关错误。我没有尝试该代码,我猜想可能分配给 asyncSnapshot.data.docs可能listStaff会返回null,但您声明的类型List<DocumentSnapshot>不允许这样做。如果您 100% 确定此赋值不会返回 null 值,则可以添加 '!' 确保编译器将是列表,因此它可以让您使用方法。不过,如果您希望此列表为空,您可以简单地添加“?” 显示它,而不是使用“?” 来使用方法。它的工作原理如下:检查对象是否为空,只有在不为空时才执行此方法。
| 归档时间: |
|
| 查看次数: |
49061 次 |
| 最近记录: |