Firebase 因无效安全(DART/FLUTTER)而无法工作

Posted

技术标签:

【中文标题】Firebase 因无效安全(DART/FLUTTER)而无法工作【英文标题】:Firebase doesn't work cause of null-safety (DART/FLUTTER) 【发布时间】:2022-01-23 17:53:17 【问题描述】:

我正在为我的数据库工作使用/学习 Firebase。我的快照就像 _jsonQuerySnapshot 或 _jsonDocumentSnapshot 一样。但它必须是 QuerySnapshot 或 DocumentSnapshot。因此,我必须对我的快照进行编码和解码以使用我的数据。 如果我不使用 encode decode json 我总是会收到 null 或 object 错误。 这是我的类从状态扩展


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如loading。 @Eray 这似乎是一个正确的答案。您可以将其发布为实际答案吗? 谢谢你提醒我@Sergi,我在经过一些改进后发布了答案。 【参考方案1】:

首先,检查您的数据是否为空,然后在其上使用[]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 等到您获取数据。例如数据库连接,从某处读/写一些东西等。

更多详情可以阅读this article。

【讨论】:

它有效。非常感谢!

以上是关于Firebase 因无效安全(DART/FLUTTER)而无法工作的主要内容,如果未能解决你的问题,请参考以下文章

无法进行 Firebase 部署 - 错误:指定的 Firebase 无效

Firebase.push 失败:第一个参数包含无效密钥 ($$hashKey)

Firebase 身份验证 iOS 12 无效令牌

firebase 云消息传递请求包含无效参数

firebase changePassword 不会因旧密码不正确而引发错误

Firebase推送通知在iOS 11中无效