【问题标题】:How to declare multiprovider in some other class than main.dart如何在 main.dart 以外的其他类中声明 multiprovider
【发布时间】:2022-01-01 22:19:52
【问题描述】:

我正在尝试在一个类中创建一个多提供者。但它与在材料应用程序上方的 main.dart 中声明 multiproviders 不同。

class Chat extends StatelessWidget {
 const Chat({ Key? key }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<ChatProvider>( create: (context) => ChatProvider()),
        ChangeNotifierProvider<MessageProvider>( create: (context) => MessageProvider()),
      ],
      child: ChatMainScreen(),
      
      // MaterialApp(
      //     debugShowCheckedModeBanner: false,
      //     home: ChatMainScreen(),
      // )
    );
  }
}

我正在从 ChatMainScreen 导航到另一个屏幕到出现此问题的新屏幕 (ChatRoom)。(ChatMainScreen => ChatRoom)

如果我用另一个材料应用程序包装我的 ChatMainScreen,它似乎可以工作。但是在材料应用程序中可以有另一个材料应用程序吗?。

此外,ChatMainScreen 路由返回的材质应用父级也无法正常工作。如果我从 ChatRoom 屏幕按下返回按钮,而不是弹出回 chatMainScreen,它会弹出到我推送到 ChatMainScreen 的屏幕

【问题讨论】:

  • 你在哪里打电话给Provider.of??它可能在另一条路线上吗?
  • 是的,在推送的新路由上调用它
  • 是的,要在许多路线上使用提供者,您必须将多提供者放在材料应用程序之上,因为不同的路线是材料应用程序的子级。
  • 那么,那么如何解决当我按下返回按钮时它会从主屏幕弹出而不是返回上一个路线的问题?那么在另一个材质应用中使用材质应用呢,这是一个好方法吗?
  • 使用多个MaterialApp 可能是个坏主意,它会产生意想不到的后果。为什么不将提供者作为值传递给新路由?如果您没有提供者,您会怎么做?

标签: flutter dart flutter-provider


【解决方案1】:

在使用Provider 时,了解context 很重要。要在任何地方访问 Provider,您可以将其放在 MaterialApp 上方,它工作正常。现在,flutter 中的MaterialApp 肯定会在内部创建一个Navigator 对象,以便它可以维护一个子路由堆栈,并且在该对象上方拥有MultiProvider 允许您访问这些提供程序。

在您的情况下,您似乎不希望在 MaterialApp 之上有提供者,所以我可以想到两种解决方案:

  1. 在您的Chat 小部件中,您创建了MultiProvider 并将ChatMainScreen 小部件用作子小部件,所以这很好,因为在您的ChatMainScreen 小部件的上下文中位于MultiProvider 下方,因此您可以访问它。在您的ChatMainScreen 的某个地方,您推送另一条打开ChatRoom 小部件的路线。如果您想访问MultiProvider 中提到的提供者,您需要推送MultiProvider,例如:
Navigator.push(
      context,
      MaterialPageRoute(
        builder: (_) => MultiProvider(
          providers: [
            ChangeNotifierProvider.value(value: Provider.of<ChatProvider>(context,
                  listen: false),
          ...
           ],
          child: ChatRoom()
         
 

使用ChangeNotifierProvider.value 将使您能够访问新路由中的同一提供商。

  1. Chat 小部件中自己创建一个新的导航器堆栈。

 return MultiProvider(
      providers: [
        ChangeNotifierProvider<ChatProvider>( create: (context) => ChatProvider()),
        ChangeNotifierProvider<MessageProvider>( create: (context) => MessageProvider()),
      ],
      child: Navigator(
              onGenerateRoute: (RouteSettings settings) {
                return MaterialPageRoute(
                  builder: (context) {
                    return ChatMainScreen();
      
     
    );

我认为第一种解决方案可能更适合您,您的应用中的 MaterialApp 小部件不应超过 1 个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多