我收到以下错误:
在构建Builder(dirty)时引发了以下断言:类型'Future'不是类型'ProduktList'的子类型
当我按下IconButton时,我想查看一个新页面。新页面需要一个产品列表。这些列表是通过addToCart函数获得的。
我的导航器:
IconButton(
icon: Icon(Icons.shopping_cart),
onPressed: (){
Navigator.push(context,
MaterialPageRoute(
builder: (context) => Einkaufswagen(produktList: addToCart(),)
)
);
}
),
addToCart函数:
addToCart() async{
CollectionReference collectionReference = Firestore.instance.collection("Benutzer").document("Anton").collection("Einkaufsliste").reference();
QuerySnapshot querySnapshot = await collectionReference.getDocuments();
List<Produkt> produktList = [];
for(int i = 0; i < querySnapshot.documents.length; i++){
ProduktList produkte = ProduktList.fromJson(querySnapshot.documents[i].data);
for(int j = 0; j < produkte.produkte.length; j++){
if(produkte.produkte[j].anzahl > 0 && produkte.produkte[j].isChecked) {
print("Item to produktList: " + produkte.produkte[j].name);
produktList.add(produkte.produkte[j]);
print("Items in produktList: " + produktList.toString() + " Anzahl: " + produktList.length.toString());
}
}
}
ProduktList toCart = ProduktList(produkte: produktList);
print("ToCart: " + toCart.produkte.length.toString());
return toCart;
}
Einkaufswagen类:
class Einkaufswagen extends StatefulWidget {
Einkaufswagen({this.produktList});
ProduktList produktList;
@override
_EinkaufswagenState createState() => _EinkaufswagenState();
}
class _EinkaufswagenState extends State<Einkaufswagen> {
_EinkaufswagenState({this.produktList});
ProduktList produktList;
getCartItems(){
print(produktList);
List<CheckboxListTile> listTile = [];
for(int i = 0; i < 5; i++){
listTile.add(
CheckboxListTile(
title: Text("Pimmel"),
value: true,
onChanged: null,
)
);
}
return listTile;
}
@override
Widget build(BuildContext context) {
print("Build");
return Scaffold(
appBar: AppBar(
title: Text("Einkaufswagen"),
),
body: Column(
children: <Widget>[
Expanded(
child: ListView.builder(
itemCount: 1,
itemBuilder: (context, index){
return Column(
children: getCartItems(),
);
},
)
)
],
),
);
}
}
我不知道如何解决此错误。也许您可以给我一些如何做得更好的建议。 谢谢您的帮助。
编辑:
class Einkaufswagen2 extends StatelessWidget {
Future<ProduktList> produktList;
Einkaufswagen2({this.produktList});
myCheckBoxListTile(int index, AsyncSnapshot snapshot){
return CheckboxListTile(
title: Text(snapshot.data.produkte[index].name),
value: snapshot.data.produkte[index].isChecked,
onChanged: (value){
print("Tap! " + snapshot.data.produkte[index].name);
snapshot.data.produkte[index].isChecked = value;
print("IsChecked: " + snapshot.data.produkte[index].isChecked.toString());
},
controlAffinity: ListTileControlAffinity.leading,
secondary: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
IconButton(
icon: Icon(Icons.add),
onPressed: (){
}
),
Text(snapshot.data.produkte[index].anzahl.toString()),
IconButton(
icon: Icon(Icons.remove),
onPressed: (){
snapshot.data.produkte[index].anzahl--;
print(snapshot.data.produkte[index].anzahl);
}
),
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Einkaufswagen"),
),
body: Container(
child: FutureBuilder(
future: produktList,
builder: (BuildContext context, AsyncSnapshot snapshot){
switch (snapshot.connectionState){
case ConnectionState.waiting : return CircularProgressIndicator();
default:
if (!snapshot.hasData){
return Text(snapshot.data.toString());
} else{
return ListView.builder(
itemCount: snapshot.data.produkte.length,
itemBuilder: (BuildContext context, int index){
return myCheckBoxListTile(index, snapshot);
}
);
}
}
}
),
),
);
}
}
在此无状态类中它可以工作,但是当我点击某些东西时它并没有改变视图,我认为是因为无状态,并且我不知道如何在有状态中实现。
答案 0 :(得分:0)
使用Future的方式存在一些问题。
首先,最好更改addToCart函数以返回产品的未来:
Future<List<Product>> addToCart() async{
...
}
除此之外,您还将Future传递给另一个小部件:
Einkaufswagen(produktList: addToCart(),)
您需要解决此Future
才能获得实际列表,而不是其未来版本。最好的方法是在小部件中使用FutureBuilder:
return new FutureBuilder(
future: addToCart(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
return new Center(child: new CircularProgressIndicator());
default:
if (snapshot.hasError)
{
return new Center(child: Text('Some warning'));
}
else {
return new ListBuilder(snapshot.data)
}
}
},
);
您可以在此处找到更多信息:FutureBuilder