![](/img/trans.png)
[英]The method [] can't be unconditionally invoked because the receiver can be null
[英]The method '[]' can't be unconditionally invoked because the receiver can be 'null'
我是 Flutter 的新手。我正在嘗試開發一個應用程序。
我想顯示 Firebase 數據庫中的員工列表。 但是,我收到以下錯誤。
錯誤:
無法無條件調用方法“[]”,因為接收者可以為“null”。 嘗試使調用有條件(使用'?.')或向目標('.')添加 null 檢查。
科德拉里姆:
`import 'package:calendar/page/mainPage.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class Staff extends StatefulWidget {
@override
_StaffState createState() => _StaffState();
}
class _StaffState extends State<Staff> {
final _firestore = FirebaseFirestore.instance;
@override
Widget build(BuildContext context) {
// ignore: unused_local_variable
CollectionReference staffRef = _firestore.collection('staff');
return Scaffold(
appBar: AppBar(
title: Text("Personel Listesi"),
backgroundColor: Colors.redAccent[400],
actions: <Widget>[
IconButton(
icon: Icon(Icons.home),
onPressed: () {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (_) => MainPage()),
(route) => true);
},
),
],
),
body: Container(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Column(
children: [
StreamBuilder<QuerySnapshot>(
stream: staffRef.snapshots(),
builder: (BuildContext context, AsyncSnapshot asyncSnapshot) {
if (asyncSnapshot.hasError) {
return Center(
child: Text(
"Bir hata oluştu, lütfen tekrar deneyiniz."));
} else {
if (asyncSnapshot.hasData) {
List<DocumentSnapshot> listStaff =
asyncSnapshot.data.docs;
return Flexible(
child: ListView.builder(
itemBuilder: (context, index) {
return Card(
elevation: 20,
color: Colors.greenAccent[200],
child: ListTile(
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () async {
await listStaff[index]
.reference
.delete();
},
),
title: Text(
'${listStaff[index].data['nameSurname']}',
style: TextStyle(fontSize: 20),
),
subtitle: Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Text(
'${listStaff[index].data['tip']}',
style: TextStyle(fontSize: 14),
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Text(
'${listStaff[index].data['mail']}',
style: TextStyle(fontSize: 14),
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Text(
'${listStaff[index].data['phone']}',
style: TextStyle(fontSize: 14),
),
],
),
],
),
),
);
},
itemCount: listStaff.length),
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
}
},
),
],
),
),
),
),
);
}
}
`
我和提問者有同樣的問題,解決方案來自這篇文章。 我把它留在這里,以防其他人有這個問題。 https://fileidea.com/2021/05/05/method-cant-be-unconditionally-invoked-because-the-receiver-can-be-null-with-firestore/
前:
final mySnapStream = messagesCollection
.orderBy('date', descending: true)
.limit(100)
.snapshots()
.map((obj) => obj.docs
.map((e) => new MyItem(
e.data()['myFieldOne'],
e.data()['myFieldThree'],
e.data()['myFieldFour']))
.toList());
after:
final mySnapStream = messagesCollection
.orderBy('date', descending: true)
.limit(100)
.snapshots()
.map((obj) => obj.docs
.map((e) => new MyItem(
(e.data() as dynamic)['myFieldOne'],
(e.data() as dynamic)['myFieldThree'],
(e.data() as dynamic)['myFieldFour']))
.toList());
在新的 flutter 更新中,我們不需要添加.data()
我的代碼如下
title: Text(
**'${listStaff[index].data['nameSurname']}',**
style: TextStyle(fontSize: 20),
),
像這樣更改它修復了錯誤。
title: Text(
**'${listPersonel[index]['nameSurname']}'**,
style: TextStyle(fontSize: 20),
),
這是一個典型的空安全相關錯誤。 我沒有嘗試代碼,我猜可能將asyncSnapshot.data.docs
分配給listStaff
可能會返回null ,但是您聲明的類型List<DocumentSnapshot>
不允許這樣做。 如果您 100% 確定此分配不會返回 null 值,則可以添加“,”以確保編譯器將是 List。 所以它會讓你使用方法,雖然如果你希望這個列表是空的? 你可以簡單地添加','來顯示它? 而不是使用'..'來使用方法:它就像。 檢查 object 是否為 null 並僅在不是時才在此方法上執行方法。
如果您正在訪問可為空的List
或Map
上的元素,則會收到此錯誤。 讓我們了解它的List
,您可以為您的Map
應用相同的解決方案。
例如:
List<int>? someList;
void main() {
int a = someList[0]; // Error
}
使用局部變量:
var list = someList; if (list;= null) { int a = list[0]; // No error }
使用?
和??
:
int a = someList?[0]?? -1; // -1 is the default value if List was null
使用!
僅當您確定List
不是null
時才使用 bang 運算符。
int a = someList;[0];
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(), }, )
使用as
將Object
向下轉換為您的類型,例如List
或Map
。
FutureBuilder( future: _listOfInt(), builder: (_, snapshot) { if (snapshot.hasData) { var myList = snapshot.data; as List<int>; // <-- Your data using 'as' } return Container(), }, )
如果你使用 FutureBuilder 試試 FutureBuilder
對於 Firebase snapshot.data!['YourData']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.