我正在尝试了解回调的工作方式,并已阅读所有内容。但是我的代码不起作用。 我有一个“产品”父级,它显示视图的固定部分,但是然后显示“列表”或“编辑”子级。没有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不作为方法存在。
我的理解上显然有差距。如果可能的话,有人可以解释一下它为什么会损坏,而不是仅仅编写一个解决方案,因为我相信根据文档,我对此的理解是正确的。
答案 0 :(得分:0)
子级:ProductListView(callBackToProductFromList:_callBackFromProductList()),
应该是
子级:ProductListView(callBackToProductFromList:_callBackFromProductList),
使用(),您将立即调用该函数,而不会自行传递该函数