如何修复"The following assertion was thrown building Builder(dirty): type 'Future<dynamic>' is n



我收到以下错误:

以下断言被抛出 构建构建器(脏):类型"未来"不是类型"ProduktList"的子类型

当我按下图标按钮时,我想看到一个新页面。新主页需要商品列表。这些列表我通过函数addToCart获得。

我的导航器:

IconButton(
          icon: Icon(Icons.shopping_cart),
          onPressed: (){
            Navigator.push(context,
                MaterialPageRoute(
                    builder: (context) => Einkaufswagen(produktList: 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;
}

艾因考夫斯摩根类:

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);
                    }
                  );
                }
            }
          }
        ),
      ),
    );
  }
}
在这个无状态

类中,它可以工作,但是当我点击某些内容时它并没有改变视图,我认为是因为无状态,我不知道如何在有状态中实现。

您使用 Future 的方式存在一些问题。

首先,最好更改 addToCart 函数以返回 Future of Produkts:

Future<List<Product>> addToCart() async{
   ...
}

除此之外,您还将未来传递给另一个小部件:

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)
            }
      }
    },
);

您可以在此处找到更多信息: 未来建设者

相关内容

最新更新