【问题标题】:The getter 'length' was called on null - Flutter在 null 上调用了 getter 'length' - Flutter
【发布时间】:2021-12-10 05:20:56
【问题描述】:

我正在尝试从 firestore 数据库中获取数据,并且这段代码运行良好。但是现在它不起作用,我收到了这个错误

在 null 上调用了 getter 'length'。

接收者:空

尝试调用:长度"

这是出现错误的代码。

class MiddleHelpers extends ChangeNotifier {
  Widget datafav(BuildContext context, String collection) {
    return Container(
      height: 280.0,
      child: FutureBuilder(
        future: Provider.of<ManageData>(context, listen: false)
            .fetchData(collection),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Center(
              child: CircularProgressIndicator(),
            );
          } else {
            return ListView.builder(
              scrollDirection: Axis.horizontal,
              itemCount: snapshot.data.length,
              itemBuilder: (BuildContext context, int index) {
                return GestureDetector(
                  onTap: () {
                    Navigator.push(
                      context,
                      PageTransition(
                          child: DetailScreen(
                              queryDocumentSnapshot: snapshot.data[index]),
                          type: PageTransitionType.bottomToTop),
                    );
                  },
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Container(
                      decoration: const BoxDecoration(
                        borderRadius: BorderRadius.all(
                          Radius.circular(20.0),
                        ),
                        color: Colors.white,
                        boxShadow: [
                          BoxShadow(
                            color: Colors.black26,
                            blurRadius: 5,
                            // spreadRadius: 3,
                            offset: Offset(3, 3),
                          ),
                        ],
                      ),
                    ),
                  ),
                );
              },
            );
          }
        },
      ),
    );
  }
}

获取数据方法

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';

class ManageData extends ChangeNotifier {
  FirebaseFirestore firebaseFirestore = FirebaseFirestore.instance;
  Future fetchData(String collection) async {
    QuerySnapshot querySnapshot =
        await firebaseFirestore.collection(collection).get();
    return querySnapshot.docs;
  }
}

设备错误

【问题讨论】:

  • 检查 !snapshot.hasData 也在您的微调器检查中。

标签: flutter flutter-futurebuilder


【解决方案1】:

我猜你的 snapshot.data 是 null 可能有错误。尝试添加

if (snapshot.hasError){ return Text('Something went wrong'); } 内部建设者

更多信息在这里 https://firebase.flutter.dev/docs/firestore/usage

【讨论】:

    【解决方案2】:

    您似乎没有收到来自未来的数据,这就是您不能使用.length 的原因。另外,必须确保数据存在,然后使用.length。

    最好引入FutureBuilder过程中可能发生的所有状态。

    检查

    • snapshot.connectionState 如果是 waiting 或 done。那么
    • 如果snapshot.hasError,最后是else 或hasData
    • 如果snapshot.hasData,也可以检查数据长度>0或snapshot.data!.exist然后返回ListView.builder

    我更喜欢this example of firestore。

        if (snapshot.hasError) {
              return Text("Something went wrong");
            }
    
            if (snapshot.hasData && !snapshot.data!.exists) {
              return Text("Document does not exist");
            }
    
            if (snapshot.connectionState == ConnectionState.done) {
    
             return ListView.builder(
                  scrollDirection: Axis.horizontal,
                  itemCount: snapshot.data!.length,
       ///.............
            }
    
            return const Center(
                  child: CircularProgressIndicator(),
    
    

    更多关于

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 2021-05-25
      • 2023-03-08
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      相关资源
      最近更新 更多