Почему мой виджет без сохранения состояния не использует данные поставщика? - PullRequest
0 голосов
/ 16 апреля 2020

Моя цель - сгенерировать чипы выбора ( SelectionItems ) в виджете Wrap , который находится внутри его родительского виджета ( SelectionRow ). Список данных ( rowBody ), которые будут использоваться для генерации микросхем, передается в родительский виджет, а затем преобразуется в модели, которые я теперь собираюсь использовать для передачи в функцию для генерации виджетов. как видно из приведенного ниже кода.

class SelectionRow extends StatelessWidget {

  SelectionRow({this.rowCategoryHeader, this.rowBody});
  final String rowCategoryHeader;
  final List rowBody;

  //SelectionOptionModelData selection= SelectionOptionModelData();

  @override
  Widget build(BuildContext context) {

    //Generate the models from the list acquired from the database
    Provider.of<SelectionOptionModelData>(context).generateModelsFromList(rowBody);

    //TODO: selectionOptionModels doesn't get any content in the array returned to it.

    return Consumer<SelectionOptionModelData>(
      builder: (context, selectionOptionModels, child) {

        print(selectionOptionModels.getSelectionOptionModels);

        return Center(
          child: Container(
            margin: EdgeInsets.symmetric(vertical: 10),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Container(
                  margin: EdgeInsets.symmetric(vertical: 5),
                  child: Text(
                    rowCategoryHeader.toUpperCase(),
                    style: kROW_HEADING_TEXT,
                  ),
                ),
                Wrap(
                  spacing: 5,
                  runSpacing: 5,
                  children:
                      //Generate widgets from the selectionOptionModels in the provider.
                      generateSelectionItemWidgets(
                       selectionOptionModels.getSelectionOptionModels,
                          context
                      ),
                )
                        ...

Теперь я создал класс провайдера, в котором размещается функция для получения списка данных ( rowBody ) вместе с другими функциями, как видно. в коде ниже. Это провайдер, который используется моим SelectionRow виджетом выше.

class SelectionOptionModelData with ChangeNotifier{


  List<SelectionModel> _selectionOptionModels = [];

  void generateModelsFromList(List<Map<String,dynamic>> ingredientList) {

    for (var ingredient in ingredientList) {
      _selectionOptionModels.add(
          SelectionModel(
              name: ingredient['title'],
              price: ingredient['price']
          )
      );
    }
    notifyListeners();
  }


   List<SelectionModel> get getSelectionOptionModels{
     return _selectionOptionModels;
  }


  void updateSelectionOptionModel(SelectionModel selectionOption){
    selectionOption.toggleSelected();
    notifyListeners();
  }


}

Моя проблема сейчас заключается в том, что функция generateSelectionItemWidget в моем Wrap виджет внутри родительского элемента SelectionRow почему-то не получает модели, необходимые для генерации этого виджета. Так что я действительно не могу понять, почему это так, поскольку эта функция должна была получить требуемые модели от потребляемого поставщика.

Заранее большое спасибо.

РЕДАКТИРОВАНИЕ

Ниже приведен основной файл, в который я поместил дерево со всеми моими провайдерами.

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<SelectionOptionModelData>(create: (_)=>SelectionOptionModelData(),),
        ChangeNotifierProvider<ComboList>(create: (_)=>ComboList()),
        ChangeNotifierProvider<ComboPrice>(create: (_)=>ComboPrice())
      ],
          child: MaterialApp(
            debugShowCheckedModeBanner: false,
            theme: ThemeData(
              primarySwatch: Colors.grey,
            ),
            home: CustomizeScreen(),
          ),
        );
  }
}

ОБНАРУЖЕНА ОШИБКА ПОСЛЕ ПОЛУЧЕНИЯ ЭТОГО РАБОТЫ

flutter: ══╡ EXCEPTION CAUGHT BY FOUNDATION LIBRARY ╞════════════════════════════════════════════════════════
flutter: The following assertion was thrown while dispatching notifications for SelectionOptionModelData:
flutter: setState() or markNeedsBuild() called during build.
flutter: This _DefaultInheritedProviderScope<SelectionOptionModelData> widget cannot be marked as needing to
flutter: build because the framework is already in the process of building widgets.  A widget can be marked
flutter: as needing to be built during the build phase only if one of its ancestors is currently building.
flutter: This exception is allowed because the framework builds parent widgets before children, which means a
flutter: dirty descendant will always be built. Otherwise, the framework might not visit this widget during
flutter: this build phase.
flutter: The widget on which setState() or markNeedsBuild() was called was:
flutter:   _DefaultInheritedProviderScope<SelectionOptionModelData>
flutter: The widget which was currently being built when the offending call was made was:
flutter:   SelectionRow
flutter:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...