首页 > 解决方案 > 调用函数时没有这样的方法错误

问题描述

我通过 future builder 从 Firebase 检索了我的电子商务主页的产品数据。我创建了另一个屏幕,当用户从电子商务主页单击产品时,它会显示有关产品的更多信息。为了导航到更多信息屏幕,我创建了一个名为 showProduct 的函数并使用按钮调用它,但是当按钮id 按下它显示 NoSuchMethodError: The method '[]' was called on null.Receiver: null 尝试调用。showProduct 功能 ] 也用于供应商资料页面,其中显示的产品显示在 gridview 中,当单击供应商资料中的任何产品时。 showProduct 功能起作用并打开更多信息屏幕。

电子商务首页:

c

lass Shop extends StatefulWidget {

  final Prod products;
  final User currentUser;
  final String prodId;
  final String onwerId;
  Shop({ this.currentUser,
    this.prodId,
    this.products,
    this.onwerId});

  @override
  _ShopState createState() => _ShopState( prodId: this.prodId,products: this.products,ownerId:this.onwerId);
}

class _ShopState extends State<Shop> {

  String postOrientation = "grid";
  String shopOrientation = "grid";
  bool isFollowing = false;
  bool isLoading = false;
  String uid="";
  String prodId;
  String ownerId;
  Prod products;
  _ShopState({
    this.prodId, this.products,this.ownerId,
  });

  @override
  void initState() {
    super.initState();
    showProduct;
  }

  Future getProducts()async {
    var firestore = Firestore.instance;
    QuerySnapshot snap = await firestore.collectionGroup("userProducts").getDocuments();
    return snap.documents;
  }
  Future<Null>getRefresh()async{
    await Future.delayed(Duration (seconds : 3));
    setState(() {
      getProducts();
    });
  }
  showProduct(context) {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => ProductScreen(
          prodId: prodId,
          userId: ownerId,
        ),
      ),
    );
  }
  @override
  Widget build(BuildContext context) {
    return
      Scaffold(
        appBar:  AppBar(backgroundColor: kSecondaryColor,
          title: Text(   'Shop',
            style: TextStyle(
                fontFamily :"MajorMonoDisplay",
                fontSize:  35.0 ,
                color: Colors.white),),
          iconTheme: new IconThemeData(color: kSecondaryColor),
        ),
        backgroundColor: kPrimaryColor,
        body:FutureBuilder(
            future: getProducts(),
            builder: (context,snapshot)
            {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return Center(child: circularProgress(),);
              } else {
                return
                  RefreshIndicator(
                      onRefresh: getRefresh,
                      child: ListView.builder(
                        itemCount: snapshot.data.length,
                          itemBuilder: (context, index) {
                            var ourdata = snapshot.data[index];
                            return
                              Container(
                                height: 500,
                                margin: EdgeInsets.only(
                                    top: 1.0, left: 10.0, right: 10.0, bottom: 1.0),
                                child: Column( children: <Widget>[
                                  SizedBox( height:1.0,),
                                Stack(
                                  children: <Widget>[
                                Container(
                                child:Row(
                                  children: <Widget>[
                                  Expanded(
                                  child: Container(
                                  height: 400.0,
                                  child: ClipRRect(borderRadius: BorderRadius.circular(20.0),
                                    child: cachedNetworkImage(ourdata.data['shopmediaUrl'],
                                    ),
                                  ),
                                ),
                              ),
                            ],
                            ),
                            ),
                            Expanded(
                            child: Positioned(
                            bottom: 10,
                            left: 10,
                            child: Container(
                            height: 40,
                            width: 40,
                            child: ClipRRect(
                            borderRadius: BorderRadius.circular(40.0),
                            child: Image.network(ourdata.data['photoUrl'],)),
                            ),
                            ),
                            ),
                            Expanded(
                            child: Positioned(
                            bottom: 20,
                            left: 60,
                            child: Container(
                            child: Text(ourdata.data['username'],style: TextStyle(color: Colors.white,fontWeight:FontWeight.bold),),
                            ),
                            ),
                            ),
                            Container(
                            alignment: Alignment.bottomRight,
                            child: GFButton(
                             onPressed: () => showProduct(context) ,
                            text: "More",
                            icon: Icon(Icons.card_travel),
                            shape: GFButtonShape.pills,
                            ),
                            ),
                            ],
                            ),
                            Row(
                            children: <Widget>[
                            Container(
                            child: Text(ourdata.data['productname'],style: TextStyle(color: kText,fontSize: 30.0,fontWeight:FontWeight.bold),),
                            ),
                            ],
                            ),
                            Row(
                            children: <Widget>[
                            Container(  child: Text('₹',style: TextStyle(color: kText,)),
                            ),
                            Container(
                            child: Text(ourdata.data['price'],style: TextStyle(color: kText,fontSize: 20.0,fontWeight:FontWeight.bold),),
                            ),
                            ],
                            ),
                            Divider(color: kGrey,),
                            ],
                            ),
                            );
                          }
                      )
                  );
              }
            }
        ),
        floatingActionButton: FloatingActionButton(
          backgroundColor: Colors.black38,
          onPressed: ()
          async{ Navigator.push(context, MaterialPageRoute(builder: (context) =>Uploadecom(currentUser: currentUser, )));
          },
          child: Icon(Icons.add_box),
        ),
      );
  }
}

这是供应商资料上的网格视图。

 class ProductTile extends StatelessWidget {
  final Prod products;

  ProductTile(this.products);

  showProduct(context) {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => ProductScreen(
          prodId: products.prodId,
          userId: products.ownerId,
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () => showProduct(context),
      child: cachedNetworkImage(products.shopmediaUrl),
    );
  }
}

如果您需要更多代码,请询问我。

标签: firebaseflutterdart

解决方案


推荐阅读