代码之家  ›  专栏  ›  技术社区  ›  Stéphane de Luca

要从“initState()”异步初始化的提供程序,但get'找不到正确的提供程序`

  •  0
  • Stéphane de Luca  · 技术社区  · 3 年前

    我开发了一个广告应用程序,在详细视图上有一个消息按钮。

    当用户点击它时,聊天视图(有状态的小部件)就会被推到屏幕上。

    initState()用于调用 asyncInitMessages() 其从远程数据库异步地获取聊天和相关消息。这个 异步初始化消息() 属于 Chats 扩展的类 ChangeNotifier 。

    
    /// A chat conversation
    class Chats extends ChangeNotifier {
      /// Internal, private state of the chat.
    
    
      void asyncInitMessages(
          {required ClassifiedAd ad,
          required String watchingUserId,
          required bool isOwner}) async {
    
         // blah blah
      }
    }
    
    

    这个 ClassifiedAdMessagesView 有状态的小部件类实现如下(snippt):

    
      @override
      void initState() {
        
        // == Fetch conversation and messages 
        asyncInitMessages();
    
      }
    
    
    void asyncInitMessages() async {
        // === Update all messages
        try {
          Provider.of<Chats>(context, listen: false).asyncInitMessages(
              ad: widget.ad,
              watchingUserId: widget.watchingUser!.uid,
              isOwner: _isOwner);
        } catch (e) {
          if (mounted) {
            setState(() {
              _error = "$e";
              _ready = true;
            });
          }
        }
      }
    
    
      @override
      Widget build(BuildContext context) {
        // <<<<<<<<<<< The exception fires at the Consumer line right below
        return Consumer<Chats>(builder: (context, chats, child) {
          return Scaffold(
            // ... blah blah 
    
    

    最后,当运行所有这些时,我在 Consumer 线路:

    找不到正确的提供程序<聊天>

    非常感谢您的帮助。

    [更新]

    这是主屏幕(离信息屏幕很远)

    
    
    Future<void> main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      //if (Firebase.apps.isEmpty) {
      await Firebase.initializeApp(
        options: DefaultFirebaseOptions.currentPlatform,
      );
      // } else {
      //   Firebase.app(); // if already initialized, use that one
      // }
      if (USE_DATABASE_EMULATOR) {
        FirebaseDatabase.instance.useDatabaseEmulator(emulatorHost, emulatorPort);
      }
    
      runApp(RootRestorationScope(
          restorationId: 'root',
          child: ChangeNotifierProvider(
              create: (context) => StateModel(),
              child: const App())));
    }
    
    
    class App extends StatefulWidget {
      const App({super.key});
      @override
      State<App> createState() => _AppState();
    }
    
    class _AppState extends State<App> {
    
      @override
      Widget build(BuildContext context) {
        return PersistedAppState(
            storage: const JsonFileStorage(),
            child: MultiProvider(
                providers: [
                  ChangeNotifierProvider<ThemeModel>.value(value: _themeModel),
                  //ChangeNotifierProvider<AuthModel>.value(value: _auth),
                ],
                child: Consumer<ThemeModel>(
                    builder: (context, themeModel, child) => MaterialApp(
                      // blah blah
    
        }
      }
    }
    
    

    而位于

    
    
    /// Classified ad detail view
    class ClassifiedAdDetailView extends StatefulWidget {
      final User? watchingUser;
      final ClassifiedAd ad;
    
      const ClassifiedAdDetailView(
          {Key? key, required this.watchingUser, required this.ad})
          : super(key: key);
    
      @override
      State<ClassifiedAdDetailView> createState() => _ClassifiedAdDetailViewState();
    }
    
    class _ClassifiedAdDetailViewState extends State<ClassifiedAdDetailView>
        with TickerProviderStateMixin {
    
     @override
      Widget build(BuildContext context) {
        return ChangeNotifierProvider(
            create: (context) => Chats(),
            builder: ((context, child) => Scaffold(
    
    // blah blah
    
              ElevatedButton(
                onPressed: () => Navigator.of(context).push(MaterialPageRoute(
                                    builder: (context) => ClassifiedAdMessagesView(
                                        ad: ad,
                                        watchingUser: widget.watchingUser)));
                              }),
    
    
    
    2 回复  |  直到 3 年前