首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复“引发building (脏)的下列断言:类型'Future<dynamic>‘不是’ProduktList‘的子类型”

如何修复“引发building (脏)的下列断言:类型'Future<dynamic>‘不是’ProduktList‘的子类型”
EN

Stack Overflow用户
提问于 2019-01-14 13:31:41
回答 1查看 6.4K关注 0票数 0

我得到以下错误:

引发building (脏)的断言如下:类型‘未来’不是'ProduktList‘类型的子类型

当我按下一个IconButton时,我想看到一个新的页面。新页面需要一个产品列表。这些列表由函数addToCart得到。

我的领航员:

代码语言:javascript
运行
复制
IconButton(
          icon: Icon(Icons.shopping_cart),
          onPressed: (){
            Navigator.push(context,
                MaterialPageRoute(
                    builder: (context) => Einkaufswagen(produktList: addToCart(),)
                )
            );
          }
      ),

addToCart函数:

代码语言:javascript
运行
复制
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;
}

埃金考夫班:

代码语言:javascript
运行
复制
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(),
                  );
                },
              )
          )
        ],
      ),
    );
  }
}

我不知道如何纠正这个错误。也许你可以给我一些建议,如何把它做得更好。谢谢你的帮助。

编辑:

代码语言:javascript
运行
复制
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);
                    }
                  );
                }
            }
          }
        ),
      ),
    );
  }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-14 14:23:31

你使用未来的方式有一些问题。

首先,最好更改addToCart函数以返回产品的未来:

代码语言:javascript
运行
复制
Future<List<Product>> addToCart() async{
   ...
}

除此之外,您正在将未来传递给另一个Widget:

代码语言:javascript
运行
复制
Einkaufswagen(produktList: addToCart(),)

您需要解析这个Future才能得到实际的列表,而不是它的未来。最好的方法是在小部件中使用FutureBuilder:

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54182514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档