首页 > 解决方案 > 找不到消费者提供者的祖先或找不到提供者

问题描述

我有一个多提供者配置,我在 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

标签: flutterdart

解决方案


Was a case sensitive import bug https://github.com/microsoft/TypeScript/issues/21736 .closing this question


推荐阅读