簡體   English   中英

無法無條件調用方法“[]”,因為接收者可以為“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 並僅在不是時才在此方法上執行方法。

問題:

如果您正在訪問可為空的ListMap上的元素,則會收到此錯誤。 讓我們了解它的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(), }, )
  • 使用asObject向下轉換為您的類型,例如ListMap

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM