flutter - 找不到消费者提供者的祖先或找不到提供者
问题描述
我有一个多提供者配置,我在 mainApp 中传递提供者并稍后使用 consumerProvider。但是我得到了未找到祖先的错误。相同的设置适用于另一个视图,但可能由于导航而产生问题
我已经尝试了一些我在stackoverflow中发现的类似问题的选项,这些选项说明移动提供程序并查看提供的上下文但没有找到任何解决方案
首先是我的 Provider.dart 文件
List<SingleChildCloneableWidget> providers = [
...independentServices,
...dependentServices,
];
List<SingleChildCloneableWidget> independentServices = [
Provider.value(value: FirebaseNewsService()),
Provider.value(value: FirebaseEventsService())
];
List<SingleChildCloneableWidget> dependentServices = [
ProxyProvider<FirebaseNewsService, NewsListModel>(
builder: (context, newsService, _) {
return NewsListModel(newsService: newsService);
}),
ProxyProvider<FirebaseNewsService, NewsCreateModel>(
builder: (context, newsService, _) {
return NewsCreateModel(newsService: newsService);
},
),
ProxyProvider<FirebaseEventsService, EventsListModel>(
builder: (context, eventsService, _) {
return EventsListModel(eventsService: eventsService);
}),
];
接下来是main.dart文件
class MainApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: providers,
child:MaterialApp(
title: 'MyApp',
initialRoute: RoutePaths.Home,
onGenerateRoute: Router.generateRoute, )
);
}
}
接下来是发生路由的 router.dart 文件
class Router {
static Route<dynamic> generateRoute(RouteSettings settings) {
switch (settings.name) {
// this is working
case RoutePaths.Home:
return MaterialPageRoute(builder: (context) {
NewsListModel model = Provider.of(context);
return ChangeNotifierProvider<NewsListModel>.value(
value: model, child: NewsPage());
});
break;
case RoutePaths.Events:
return MaterialPageRoute(builder: (_) {
EventListModel model = Provider.of(context);
return ChangeNotifierProvider<EventListModel>.value(
value: model, child: EventsListPage());
});
break;
我的主页文件
class NewsPage extends StatelessWidget {
final String _tab1title = allTranslations.text('newsPage.tabtitleone');
final String _tab2title = allTranslations.text('newsPage.tabtitletwo');
static const _tablength = 2;
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: _tablength,
child: Scaffold(
drawer: Menu(), //Maybe Menu is having a different context
body: NestedScrollView(
...
body: Tabbarview(children: [] . // this works fine
在问题小部件中,事件列表 .dart 文件
class EventListPage extends statelessWidget {
Widget build(BuildContext context) {
EventListModel model = Provider.of(context);
return Scaffold(drawer: Menu(), appBar: AppBar(), body: ChangeNotifierProvider<EventsListModel>.value(
value: model,
child: Consumer<EventsListModel>(
builder: (context, model, child) => model.busy
? Center(
child: CircularProgressIndicator(),
)
: Column(mainAxisSize: MainAxisSize.max, children: <Widget>[
SmartRefresher(
//key: EventsPageModel.eventsFollowKey,
controller: model.refreshController,
enablePullDown: true,
header: WaterDropMaterialHeader(
backgroundColor: Theme.of(context).primaryColor,
),
enablePullUp: true,
onRefresh: model.onRefresh,
onLoading: model.onLoading,
child: buildchild(model, context)),
]),
),
);
}
我总是找不到消费者的祖先或找不到正确的提供者。我做错了。
同样的事情适用于 NewsListModel
解决方案
Was a case sensitive import bug https://github.com/microsoft/TypeScript/issues/21736 .closing this question
推荐阅读
- javascript - 当客户端发送无效的 uuid 时,服务器应该响应什么错误?
- angular - 在 p 表的列中添加按钮
- azure-devops - Azure Devops Pipelines 与 Bitbucket 的集成未显示触发构建的用户
- storybook - 使用 Storybook 将 .stories 文件导入另一个 .stories 文件?
- python - IndexError:运行 rasa shell 和 actions.py 文件时元组索引超出范围
- logstash - 修剪字段logstash中的空格
- java - 如果值不同,Java Map 将拒绝 put
- android - 导入 kotlinx.android.synthetic 失败:Android Studio 没有找到它,但我可以运行该应用程序
- python - 根据另一列中的条件选择两列中的值(Python)
- java - 如何让计数器在此代码中工作?