如何构建 Flutter 应用的架构

Posted

技术标签:

【中文标题】如何构建 Flutter 应用的架构【英文标题】:How to build the architecture of a flutter app 【发布时间】:2020-04-12 10:33:04 【问题描述】:

我正在 Flutter 中实现一个基于聊天的应用程序。我正在考虑使用 Provider 包来创建两个主要的通知程序:UserService 和 ChatService。第一个处理登录(以及与用户相关的所有其他功能),而后者处理特定于聊天的功能。但是,chatService 需要访问 UserService 以获得某些功能。我尝试使用 ProxyProvider,这是代码:

class _MyAppState extends State<MyApp> 
  @override
  Widget build(BuildContext context) 
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<UserService>(builder: (_) => UserService.instance()),
        ChangeNotifierProxyProvider<UserService, ChatService>(builder: (_, user, chatService) => ChatService.init(user))
      ],
      child: MaterialApp(
          ...
      ),
    );
  

但是,当我运行应用程序时,flutter 会抛出此错误:

尝试使用带有 Listenable/Stream (ChatService) 子类型的 Provider。

这很可能是一个错误,因为提供者不会自动更新家属 当 ChatService 更新时。相反,请考虑将 Provider 更改为更具体的 处理更新机制的实现,例如:

ListenableProvider ChangeNotifierProvider ValueListenableProvider

谢谢!

【问题讨论】:

我再次运行模拟器,现在,奇怪的是,它可以工作了。 【参考方案1】:

不清楚你将使用哪种“架构”,Provider 只是一种以安全方式检索小部件树中对象的机制。

假设您的意思是 UserServiceChatService,它们是 ChangeNotifiers(可以是 BLoC 或其他任何东西) - 下面是如何将它们与 Provider 挂钩的示例:

main() 
  runApp(MultiProvider(
    providers: [
        ChangeNotifierProvider<UserService>(create: (_) => UserService()),
        ChangeNotifierProxyProvider<UserService, ChatService>(
          create: (_) => ChatService(),
          update: (_, userService, chatService) => chatService..userService= userService
        ),
      ],
      child: MyApp(),
  ));


class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Consumer<ChatService>(
      builder: (context, chatService, _) => Text(chatService.currentUser.lastMessage) // or whatever you need to do
    );
  

【讨论】:

与架构我的意思是要创建哪些组件(在您的情况下是通知程序)以及其中有多少(一个通知程序可以避免我的问题,而您的情况下是两个通知程序)。感谢您的回复! 我遇到了同样的错误,但现在我看到了我的错误,我使用的是 ProxyProvider 而不是 ChangeNotifierProxyProvider。谢谢!!!

以上是关于如何构建 Flutter 应用的架构的主要内容,如果未能解决你的问题,请参考以下文章

入门Flutter Widget

Flutter框架详解

如何使用 Flutter 构建 iOS AdHoc 应用

如何设置 Flutter 应用的构建和版本号

在 Android 上构建 Flutter 应用程序时如何修复“依赖失败”

如何在 Flutter 中构建 apk 创建旧版本应用程序