Моя цель - сгенерировать чипы выбора ( 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: