Flutter 错误 - 断言失败:第 213 行 pos 15:'data != null':在从 firestore 获取数据时不正确

Posted

技术标签:

【中文标题】Flutter 错误 - 断言失败:第 213 行 pos 15:\'data != null\':在从 firestore 获取数据时不正确【英文标题】:Flutter error - failed assertion: line 213 pos 15: 'data != null': is not true at the time of fetching data from firestoreFlutter 错误 - 断言失败:第 213 行 pos 15:'data != null':在从 firestore 获取数据时不正确 【发布时间】:2018-11-13 00:24:59 【问题描述】:

使用 Flutter 开发 android 应用程序。尝试从 Firestore 获取文档并通过小部件显示在屏幕上。这是我的代码...

import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:image_picker/image_picker.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

class HomePage extends StatefulWidget 
  @override
  HomePageState createState() => new HomePageState();


class HomePageState extends State<HomePage> 

  @override
  void initState() 
    super.initState();
  



  @override
  Widget build(BuildContext context) 

    Widget userTimeline = new Container(
        margin: const EdgeInsets.only(top: 30.0, right: 20.0, left: 20.0),
        child: new Row(
          children: <Widget>[
            new Expanded(
                child: new Column(
              children: <Widget>[
                new StreamBuilder<QuerySnapshot>(
                  stream: Firestore.instance.collection('tripsDocs').snapshots(),
                  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) 
                    if (!snapshot.hasData) return new Text('Loading...');

                    new ListView(
                      children: snapshot.data.documents.map((DocumentSnapshot document) 
                        new ListTile(
                          title: document['docTitle'] != null? new Text(document['docTitle']) : new Text("Hello"),
                          subtitle: new Text('Suresh'),
                        );
                      ).toList(),
                    );
                  ,
                )
              ],
            ))
          ],
        ));

    return new Scaffold(

      body: new ListView(
        children: <Widget>[
          userTimeline,
        ],
      ),

    );

  

但是,每当我执行这个小部件时,我都会收到以下错误...

'package:flutter/src/widgets/text.dart': Failed assertion: line 213 pos 15: 'data != null': is not true

无法理解出了什么问题。

【问题讨论】:

你确定“document['docTitle']”不为空吗?如果它为 null,则 Text 可能会抛出该异常 也可以是null。在那种情况下,我不能这样做title: new Text(document['docTitle'] ?? 'Hello')吗? 标题:新文本(文档['docTitle'] ??'Hello')。这不正确,请检查我的答案 【参考方案1】:

这里是Text的构造函数

const Text(this.data, 
    Key key,
    this.style,
    this.textAlign,
    this.textDirection,
    this.softWrap,
    this.overflow,
    this.textScaleFactor,
    this.maxLines,
  ) : assert(data != null),
       textSpan = null,
       super(key: key);

最终字符串数据;

如您所见,data是必填字段,不能为空。

如果您的数据可能为空,您可以使用以下代码

title: document['docTitle'] != null? new Text(document['docTitle']) : new Text("Hello"),

【讨论】:

我试过了,但现在我收到了这个错误...A build function returned null. The offending widget is: StreamBuilder&lt;QuerySnapshot&gt;. Build functions must never return null. To return an empty space that causes the building widget to fill available room, return "new Container()". To return an empty space that takes as little room as possible, return "new Container(width: 0.0, height: 0.0)". 我需要在return 前面加上new ListViewnew ListTitle 吗? 它说“构建函数返回 null”。你的构建功能如何? 我的构建函数返回一个 Scaffold 并且我正在从我的 Scaffold 调用上面的小部件。【参考方案2】:

此错误是因为您试图向 Text 添加一些空数据。 用于将文本内容动态添加到文本小部件,以便更好地设置您获取该数据的文本位置的状态。获取内容的延迟会导致此错误。所以数据的条件检查也很好。

@override
  void initState() 
setState(() 
       docText=document['docTitle'];
      );

    super.initState();
  

....

title: new Text( docText == null? 'Loading ..',document['docTitle']),

试试这个方法

【讨论】:

【参考方案3】:

如果您的数据不为空,则在您的项目终端上运行命令flutter clean。它可能会消除您的错误。我有类似的问题。

【讨论】:

【参考方案4】:

此消息试图指出 data 参数为空,不应该为空。如果您不想呈现文本,那么您根本不会提供Text widget。所以你需要将一个字符串传递给 Text 构造函数

明白了。调用构造函数时字符串为空。

如果你真的想显示一个 Text 小部件,你可以使用 null-aware 运算符:

Text(theString ?? '')

【讨论】:

【参考方案5】:

在 Cloud Firestore 和项目中的每个查询中更改集合的名称。

这将更改 firebase 页面上的名称,至少解决了我的问题

stream: Firestore.instance.collection("colection").snapshots(),

stream: Firestore.instance.collection("collection").snapshots(),

【讨论】:

以上是关于Flutter 错误 - 断言失败:第 213 行 pos 15:'data != null':在从 firestore 获取数据时不正确的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中的 Dart Futures 问题:断言失败:第 146 行:'<optimized out>': is not true

断言失败:第 6075 行 pos 12:'child == _child':不正确

断言失败:第 22 行 pos 14: 'url != null': is not true

断言失败:第 551 行 pos 12:'child.hasSize':不正确

错误:未布置 RenderBox,断言失败:第 1940 行 pos 12:'hasSize'

OpenCV 错误:断言失败,mat.cpp 第 537 行