颤抖的回调到父母抛出nosuchmethoderror

时间:2020-02-26 11:06:17

标签: flutter callback

我正在尝试了解回调的工作方式,并已阅读所有内容。但是我的代码不起作用。 我有一个“产品”父级,它显示视图的固定部分,但是然后显示“列表”或“编辑”子级。没有productToEdit时显示“ list”,没有productToEdit时显示“ 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方法,以在回调上执行。

最终函数callBackToProductFromList; ProductListView({Key key,this.callBackToProductFromList}):super(key:key);

表示

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

然后 widget.callBackToProductFromList();

表示

执行小部件声明的功能。

但是,在按下“编辑”按钮时,控制台将显示

编辑5e5575221e4b5c28b2ea88de BY手势引起的异常╞══════════════════════════════════════════ ═════════════════════════ 处理手势时引发了以下NoSuchMethodError: 'callBackToProductFromList' 动态调用null。 接收方:“ ProductListView”的实例 参数:[]

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

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

1 个答案:

答案 0 :(得分:0)

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

应该是

子级:ProductListView(callBackToProductFromList:_callBackFromProductList),

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