- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在类中创建一个多提供者。但它的工作原理与在 Material 应用程序上方的 main.dart 中声明多重提供程序不同。
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)
如果我用另一个 Material 应用程序包装我的 ChatMainScreen ,它似乎可以工作。但是在一个 Material 应用程序中再有另一个 Material 应用程序可以吗?
此外, Material 应用程序父级到 ChatMainScreen 的路由返回也无法正常工作。如果我从 ChatRoom 屏幕按后退按钮,它不会弹出回 chatMainScreen,而是弹出到我推送到 ChatMainScreen 的屏幕
最佳答案
使用Provider
时,了解上下文
非常重要。要在任何地方访问 Provider,您可以将其放在 MaterialApp
之上,它就可以正常工作。现在,flutter 中的 MaterialApp
肯定会在内部创建一个 Navigator
对象,以便它可以维护一个子路由堆栈,并在其上方拥有 MultiProvider
对象允许您访问这些提供程序。
就您的情况而言,您似乎不希望在 MaterialApp 之上拥有 Provider,因此我可以想到两种解决方案:
Chat
小部件中,您已经创建了 MultiProvider
并使用 ChatMainScreen
小部件作为子部件,因此这很好,因为在您的 ChatMainScreen
小部件的上下文位于 MultiProvider
下方,因此您可以访问它。在 ChatMainScreen
的某个位置,您推送另一个打开 ChatRoom
小部件的路由。如果您想访问 MultiProvider
中提到的 Provider,您需要推送 MultiProvider
,如下所示:Navigator.push(
context,
MaterialPageRoute(
builder: (_) => MultiProvider(
providers: [
ChangeNotifierProvider.value(value: Provider.of<ChatProvider>(context,
listen: false),
...
],
child: ChatRoom()
使用 ChangeNotifierProvider.value
将使您能够访问新路由中的同一提供程序。
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();
);
我认为第一个解决方案可能更适合您,并且您的应用程序中不应有超过 1 个 MaterialApp
小部件。
关于flutter - 如何在 main.dart 之外的其他类中声明 multiprovider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70552293/
例如,我试图同时获取为多个流发出的数据,但是这些流中有 2 个或更多发出相同类型的数据,比如说一个字符串。 我的问题是,是否可以同时使用相同类型的 MultiProvider 和多个 StreamPr
在我添加了 ProfileLogic 的依赖之后至 LocationLogic应用程序启动时出现以下错误: I/flutter (14674): A LocationLogic was used af
我在同步提供程序创建时遇到问题。我是 Flutter 的新手,我会尽力解释得更好。 在我的 main.dart 中,我有两个提供程序,一个用于用户身份验证,一个用于代码中的另一个小部件,它只是有一个要
我正在尝试在类中创建一个多提供者。但它的工作原理与在 Material 应用程序上方的 main.dart 中声明多重提供程序不同。 class Chat extends StatelessWidge
我正在尝试将服务实例(已在同一树级别创建)注入(inject)另一个提供者。但是在访问提供者时沿着树向下,我得到了 ProviderNotFoundException 异常。在下面的代码中,Notif
主要 void main() async { WidgetsFlutterBinding.ensureInitialized(); await Fire
我是一名优秀的程序员,十分优秀!