Я пытаюсь понять, как работают обратные вызовы, и прочитал все, что могу. Однако мой код не работает. У меня есть родительский элемент «product», который показывает фиксированные части представления, однако затем я либо показываю дочерний «list», либо «edit». «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 -----
),
);
}
}
На мой взгляд и то, что я читаю, это должно работать.
child: ProductListView (callBackToProductFromList: _callBackFromProductList ()),
означает, что
создает дочерний элемент, используя класс ProductListView, который присоединяет то, что ProductListView вызывает обратный вызов к методу Products для выполнения при обратном вызове.
final Функция callBackToProductFromList; ProductListView ({Key key, this.callBackToProductFromList}): super (key: key);
означает, что
Виджет ProductListView объявил функцию с именем callBackToProductFromList, затем устанавливает это если родительский элемент должен подключиться к
, тогда widget.callBackToProductFromList ();
означает
выполнение функции, объявленной виджетом.
Однако, при нажатии кнопки «Редактировать» консоль показывает
редактировать 5e5575221e4b5c28b2ea88de ══╡ ИСКЛЮЧЕНИЕ ЗАДАН ЖЕСТОМ ╞═════ ══════════════════════════════════════════════════ ═══════════ Следующее NoSuchMethodError было сгенерировано при обработке жеста: 'callBackToProductFromList' Dynami c вызов нуля. Получатель: Экземпляр 'ProductListView' Аргументы: []
Итак, у меня есть строка, однако ошибка говорит о том, что callBackToParentFromList не существует как метод.
Очевидно, что в моем пробеле понимание. Если возможно, может кто-нибудь объяснить, почему оно сломано, вместо того, чтобы просто кодировать решение, так как я считаю, что мое понимание этого правильно в соответствии с документацией.