首页 > 解决方案 > Flutter 对父级的回调抛出 nosuchmethoderror

问题描述

我试图了解回调是如何工作的,并且已经阅读了我能读到的所有内容。但是我的代码不起作用。我有一个显示视图的固定部分的“产品”父级,但是我然后显示“列表”或“编辑”子级。没有productToEdit时显示“list”,有时显示“edit”。要编辑的产品是全局的。

家长

class Products extends StatefulWidget {
 @override
 State<StatefulWidget> createState() {
   return _ProductsState();
 }
}

class _ProductsState extends State<Products> {

 _callBackFromProductEdit() {
   print("_callBackFromProductEdit");
   setState(() {
   });
 }
 _callBackFromProductList() {
   print("_callBackFromProductList");
   setState(() {
   });
 }

 Container getProductContainer(){
   if(globals.productToEdit.toString() != "null"){
     return Container(
       child: ProductEditView(callBackToProduct: _callBackFromProductEdit(),),
     );
   }else{
     print('getProductContainer ProductListView' );
     return Container(
       child: ProductListView(callBackToProductFromList: _callBackFromProductList()),
     );
   }
 }

和孩子

class ProductListView extends StatefulWidget {
 final Function callBackToProductFromList;
 ProductListView({Key key, this.callBackToProductFromList}) : super(key: key);

 @override
 State<StatefulWidget> createState() {
   return _ProductListState();
 }
}

class _ProductListState extends State<ProductListView> {

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

 void callingBackToParentFromList(String productId){
   print("callingBackToParent");
   globals.productToEdit=productId;
   print("with ${globals.productToEdit}");
   widget.callBackToProductFromList();
 }


 Widget build(BuildContext context) {
   return Container(

--- Lots of layout code ---

   child: SizedBox(
      width: 50,
      height: 20,
      child:RaisedButton(
      shape: RoundedRectangleBorder(
      borderRadius: new BorderRadius.circular(18.0),),
          onPressed: (){
              print('edit ${productList[i]['id'].toString()}');
              globals.productToEdit=productList[i]['id'].toString();
              widget.callBackToProductFromList();
              //callingBackToParentFromList(productList[i]['id'].toString());
 ---- a bit more code -----
     ),
   );
 }
}

对我的眼睛和我读到的东西来说,这应该有效。

孩子:ProductListView(callBackToProductFromList:_callBackFromProductList()),

方法

使用 ProductListView 类创建一个子项,该类将 ProductListView 调用的回调函数附加到 Products 方法以在回调时执行。

final Function callBackToProductFromList;ProductListView({Key key, this.callBackToProductFromList}) : super(key: key);

方法

ProductListView 小部件声明了一个名为 callBackToProductFromList 的函数,然后将此函数设置为父必须连接到的函数

然后 widget.callBackToProductFromList();

方法

执行小部件声明的函数。

但是,在按下编辑按钮时,控制台会显示

编辑5E5575221E4B5C28B2EA88DE══╡例外被手势捕获╞════════════════════════════════════════ ═══════════════════════════ 处理手势时抛出以下 NoSuchMethodError:'callBackToProductFromList' 动态调用 null。接收方:“ProductListView”实例参数:[]

所以,我有字符串,但是错误表明 callBackToParentFromList 不作为方法存在。

我的理解显然有差距。如果可能的话,有人可以解释为什么它会被破坏,而不仅仅是编写一个解决方案,因为我相信根据文档我对此的理解是正确的。

标签: fluttercallback

解决方案


孩子:ProductListView(callBackToProductFromList:_callBackFromProductList()),

应该

孩子:ProductListView(callBackToProductFromList:_callBackFromProductList),

使用 () 您将立即调用该函数,而不是自行传递该函数


推荐阅读