我有一个需要按顺序显示的小部件列表,并且我当前正在使用带有上下文推送的回调来启动下一个小部件的显示。
问题是我还没有弄清楚如何正确地将提供者传递到下一个小部件。
在我的代码中,首先定义回调,然后创建小部件列表并将回调传递到每个小部件中,最后显示序列中的第一个小部件。
这是回调。问题是下一个小部件无法使用
context.read
内的 didChangeDependencies
找到提供者。
void callback(int index, {Map<String, dynamic>? params}) {
if (index >= widgetList.length - 1) {
// no more widgets, pop all contexts
Navigator.popUntil(context, (route) => route.isFirst);
} else {
// find next widget to display
Widget targetWidget = widgetList[index + 1];
if (params != null && params.containsKey('providers')) {
// prepare to pass providers to next widget
final providers = params['providers'] as List<ChangeNotifier>;
MultiProvider multiProvider = MultiProvider(
providers: providers
.map(
(provider) => ChangeNotifierProvider.value(value: provider))
.toList(),
child: targetWidget,
);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => multiProvider),
);
} else {
// no providers to pass on, so just display the widget
Navigator.push(
context,
MaterialPageRoute(builder: (context) => targetWidget),
);
}
}
}
您为什么要转移到提供商?它通常在全球范围内使用,以便能够处理应用程序中任何位置的数据。在单独的文件中声明提供程序,然后将其导入到所需位置。
通常提供商在 MyApp() 上方公布
void main() {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => Counter()),
],
child: const MyApp(),
),
);
}