如何修复“在构建Builder(dirty)时引发了以下断言:类型'Future <dynamic>'不是'ProduktList'类型的子类型”

时间:2019-01-14 13:31:41

标签: dart flutter

我收到以下错误:

  

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

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

1 个答案:

答案 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