Флаттер обратного вызова к родительским броскам nosuchmethoderror - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь понять, как работают обратные вызовы, и прочитал все, что могу. Однако мой код не работает. У меня есть родительский элемент «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 не существует как метод.

Очевидно, что в моем пробеле понимание. Если возможно, может кто-нибудь объяснить, почему оно сломано, вместо того, чтобы просто кодировать решение, так как я считаю, что мое понимание этого правильно в соответствии с документацией.

1 Ответ

0 голосов
/ 27 февраля 2020

дочерний: ProductListView (callBackToProductFromList: _callBackFromProductList ()),

должен быть

дочерний: ProductListView (callBackToProductFromList: _callBackFromProductList),

с вызовом функция сразу и не передать функцию сама

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...