Firebase 首次使用Firestore在StreamBuilder上获取数据
我在颤振应用程序中获得了以下代码。我正在编写配方应用程序。每当我调试它时,第一次快照返回null。但第二次快照返回正确的数据。当我的“Malzemelerera”类运行时,“malzemeler”字段不获取数据并返回null异常Firebase 首次使用Firestore在StreamBuilder上获取数据,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,我在颤振应用程序中获得了以下代码。我正在编写配方应用程序。每当我调试它时,第一次快照返回null。但第二次快照返回正确的数据。当我的“Malzemelerera”类运行时,“malzemeler”字段不获取数据并返回null异常 import 'package:flutter/material.dart'; import 'package:dropdownfield/dropdownfield.dart'; import 'package:tarifler/utilities/constants
import 'package:flutter/material.dart';
import 'package:dropdownfield/dropdownfield.dart';
import 'package:tarifler/utilities/constants.dart';
class MalzemelerleAra extends StatefulWidget {
@override
State<StatefulWidget> createState() => _MalzemelerleAraState();
}
int _count = 0;
class _MalzemelerleAraState extends State {
@override
Widget build(BuildContext context) {
List<Widget> extractedChildren = <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
GetMalzemeler(),
FlatButton(
color: Colors.green,
onPressed: () => _changeListCount(true),
child: Icon(Icons.add),
),
FlatButton(
color: Colors.red,
onPressed: () => _changeListCount(false),
child: Icon(Icons.remove),
),
],
),
_malzemeAlani(),
];
for (var i = 0; i < _count; ++i) {
extractedChildren.add(_malzemeAlani());
}
return Container(
child: ListView(
children: extractedChildren,
),
);
}
_malzemeAlani() {
String malzeme_id;
Constants constt = new Constants();
List<String> malzemeler;
if (constt.malzemeler == null) {
malzemeler = ["example"];
}
else{
malzemeler = constt.malzemeler;
}
return DropDownField(
onValueChanged: (dynamic value) {
malzeme_id = value;
},
value: malzeme_id,
required: false,
hintText: "Malzeme Seç",
labelText: "Malzemeler",
items: malzemeler,
);
}
_changeListCount(bool value) {
setState(() {
if (value) {
_count++;
} else if (!value) {
_count--;
}
});
}
}
导入“包装:颤振/材料.省道”;
导入“package:dropdownfield/dropdownfield.dart”;
导入“package:tarifler/utilities/constants.dart”;
类Malzemelerera扩展了StatefulWidget{
@凌驾
State createState()=>\u malzemelererastate();
}
int _计数=0;
类(MalzemelereraState扩展状态){
@凌驾
小部件构建(构建上下文){
列表提取的子项=[
划船(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
GetMalzemeler(),
扁平按钮(
颜色:颜色。绿色,
按下时:()=>\u changeListCount(true),
子:图标(Icons.add),
),
扁平按钮(
颜色:颜色,红色,
按下时:()=>\u changeListCount(false),
子:图标(图标。删除),
),
],
),
_malzemeAlani(),
];
对于(变量i=0;i<\u计数;++i){
extractedChildren.add(_malzemeAlani());
}
返回容器(
子:ListView(
儿童:提取儿童,
),
);
}
_马尔泽梅拉尼(){
字符串malzeme_id;
常数constt=新常数();
罗列马尔泽梅勒;
if(const.malzemeler==null){
malzemeler=[“示例”];
}
否则{
马尔泽梅勒=常数马尔泽梅勒;
}
返回下拉字段(
onValueChanged:(动态值){
malzeme_id=值;
},
值:malzeme_id,
必填项:false,
hintText:“马尔泽姆·塞萨”,
标签文字:“Malzemeler”,
项目:马尔泽梅勒,
);
}
_changeListCount(布尔值){
设置状态(){
如果(值){
_计数++;
}如果(!值){
_计数--;
}
});
}
}
常数类:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
class Constants {
List<dynamic> malzemeler;
DocumentReference reference;
Constants (){}
Constants.fromMap(Map<String, dynamic> map, {this.reference})
: assert(map["malzemeler"] != null),
malzemeler = map["malzemeler"];
Constants.fromSnapshot(DocumentSnapshot snapshot)
: this.fromMap(snapshot.data, reference: snapshot.reference);
}
class GetMalzemeler extends StatefulWidget {
@override
State<StatefulWidget> createState() => GetMalzemelerState();
}
class GetMalzemelerState extends State {
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection("malzemeler").snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return LinearProgressIndicator();
} else {
final getMalzemeler = Constants.fromSnapshot(snapshot.data.documents.elementAt(0));
print(getMalzemeler.malzemeler);
return Text("example");
}
},
);
}
}
import'包:cloud_firestore/cloud_firestore.dart';
进口“包装:颤振/材料.省道”;
类常数{
罗列马尔泽梅勒;
文件参考;
常量(){}
常量.fromMap(映射映射,{this.reference})
:assert(映射[“malzemeler”]!=null),
malzemeler=map[“malzemeler”];
常量.fromSnapshot(DocumentSnapshot快照)
:this.fromMap(snapshot.data,reference:snapshot.reference);
}
类GetMalzemeler扩展StatefulWidget{
@凌驾
State createState()=>GetMalzemelerState();
}
类GetMalzemelerState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:Firestore.instance.collection(“malzemeler”).snapshots(),
生成器:(上下文,快照){
如果(!snapshot.hasData){
返回LinearProgressIndicator();
}否则{
final getMalzemeler=Constants.fromSnapshot(snapshot.data.documents.elementAt(0));
打印(getMalzemeler.malzemeler);
返回文本(“示例”);
}
},
);
}
}
这是我的firebase数据库:
谢谢你的支持
当我尝试第一个答案时,我仍然犯这个错误
════════ Exception caught by widgets library ═══════════════════════════════════
The following NoSuchMethodError was thrown building StreamBuilder<QuerySnapshot>(dirty, state: _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#f5a3f):
The getter 'documents' was called on null.
Receiver: null
Tried calling: documents
User-created ancestor of the error-causing widget was
GetMalzemeler
lib\screens\malzemelerleAra.dart:19
When the exception was thrown, this was the stack
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1 GetMalzemelerState.build.<anonymous closure>
package:tarifler/utilities/constants.dart:28
#2 StreamBuilder.build
package:flutter/…/widgets/async.dart:425
#3 _StreamBuilderBaseState.build
package:flutter/…/widgets/async.dart:125
#4 StatefulElement.build
package:flutter/…/widgets/framework.dart:4047
...
════════════════════════════════════════════════════════════════════════════════
════════ Exception caught by rendering library ═════════════════════════════════
A RenderFlex overflowed by 99765 pixels on the right.
User-created ancestor of the error-causing widget was
ListView
════════ widgets库捕获到异常═══════════════════════════════════
生成StreamBuilder时引发了以下NoSuchMethodError(脏,状态:_StreamBuilderBaseState#f5a3f):
对null调用了getter“documents”。
收件人:空
尝试呼叫:文档
导致错误的小部件的用户创建的祖先为
格马尔泽梅勒
lib\screens\malzemelerera.dart:19
当抛出异常时,这是堆栈
#0 Object.noSuchMethod(省道:核心补片/对象补片。省道:51:5)
#1 GetMalzemelerState.build。
软件包:tarifler/utilities/constants.dart:28
#2.StreamBuilder.build
包:flatter/../widgets/async.dart:425
#3_StreamBuilderBaseState.build
包:flatter/../widgets/async.dart:125
#4 StatefulElement.build
包:flatter/../widgets/framework.dart:4047
...
════════════════════════════════════════════════════════════════════════════════
════════ 呈现库捕获到异常═════════════════════════════════
右侧的RenderFlex溢出99765像素。
导致错误的小部件的用户创建的祖先为
列表视图
尝试更换!快照.hasData
到
if(snapshot.data.documents.length > 0) {
final getMalzemeler = Constants.fromSnapshot(snapshot.data.documents.elementAt(0));
print(getMalzemeler.malzemeler);
return Text("example");
} else {
return LinearProgressIndicator();
}
尝试替换
!快照.hasData
到
if(snapshot.data.documents.length > 0) {
final getMalzemeler = Constants.fromSnapshot(snapshot.data.documents.elementAt(0));
print(getMalzemeler.malzemeler);
return Text("example");
} else {
return LinearProgressIndicator();
}