我正在开发一个由两个迷你应用程序组成的超级应用程序,每个应用程序都作为一个单独的Flutter 项目.这款超级应用程序有按钮,可以使用Navigator.pushReplacement启动每个迷你应用程序.然而,我面临着一个问题,当从超级应用程序启动时,迷你应用程序中的assets资源 无法正确加载.

当从其专用项目启动迷你应用程序时,所有图像都正确显示.然而,当从超级应用程序运行时,会显示Unable to load asset... Exception. Assets not found消息.

assets资源 位于mini app的assets文件夹中,不会在Superapp项目中复制.

这些迷你应用程序包括在超级应用程序的pubspec.yaml个中,具体如下:

  petshop:
    path: ../petshop-walking
  petshop_dog_walkers_app:
    path: ../petshop_dog_walkers_app

-超级应用main.dart强:

import 'package:petshop/main.dart' as customer_app;
import 'package:petshop_dog_walkers_app/main.dart' as dog_walkers_app;
....

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  await configureDependencies();
  // Configuration executed in mini apps' main.dart
  await dog_walkers_app.configureApplication();
  await customer_app.configureApplication();

  runApp(const Application());
}

通过将包含MaterialApp的小工具推送到Navigator:

  Navigator.pushReplacement(
    context,
    MaterialPageRoute(
      builder: (context) => const customer_app.PetshopApp(),
    ),
  );

以这样一种方式构建应用程序是否可行:每个应用程序都是一个单独的Flutter 项目,并从超级应用程序启动,还是有必要将它们整合到一个单独的Flutter 项目中?

推荐答案

Problem:

超级应用程序无法访问与其他包Bundle 在一起的assets资源

迷你应用程序包的assets资源 只能在单个程序包中访问,因此超级应用程序无法找到这些assets资源 .

当你运行超级应用程序并导航到任何一个迷你应用程序包时,你仍然处于超级应用程序的上下文中,因此当它试图显示Image.asset窗口小部件时,它找不到assets资源 ,因为assets资源 是与迷你应用程序而不是超级应用程序Bundle 在一起的.

这就是为什么当你单独运行小应用时,你只能查看图片.

Solution:

指定Image.Asset的Package参数

Image.asset's documentation人起:

要使用包中的资源创建小部件,包 必须提供参数.例如,假设有一个名为my_icons的包 有图标/Heart.png.然后,要显示图像,请使用:

Image.asset('icons/heart.png', package: 'my_icons') 

包本身使用的assets资源 也应该如上所述使用包参数显示.

-Assets in packages | Image.asset-Assets in packages | Image.asset

解决方案是指定Image.asset构造函数的package参数.

因此,如果您在petshop包中的图像代码是:

Image.asset(
  'assets/pet_image.png',
)

将其更新为:

Image.asset(
  'assets/pet_image.png',
  package: 'petshop'
)

现在,petshop包中的图像将显示在超级应用程序中.

Flutter相关问答推荐

壁炉有序在Flutter

如何在Ffltter Chrome应用程序中使用webview_fltter_web显示自定义html而不是外部uri?

我有相关的下拉菜单Flutter Windows应用程序的问题

升级到Ffltter 3.16后,应用程序栏、背景 colored颜色 、按钮大小和间距都会发生变化

如何使 dart 函数变得通用?

Dart 和 flutter 错误无法在您的 PATH 中找到 git

如何从flutter连接PostgreSQL数据库?

Flutter应用无法上传到Microsoft Store

无法在 ListView (Flutter) 中限制 Card 的最大宽度

更改 flutter listview 中的布局

Flutter 判断 Uint8List 是否有效 Image

有什么办法可以消除Flutter 中的传递依赖?

如何建立最近的文件列表?

如何将 List 转换为 String []?

如何从 showModalBottomSheet 中的 topRight 和 topLeft 移除平边

Flutter:当我通过 Transform.rotate 旋转水平 ListView 时,左右边缘被切断

如何在 flutter 中过滤 DateTime(intl)?

为什么容器会填满整个空间?

如何在 tabBar 中的选项卡之间制作垂直线?

如何使用我拥有的 .jks 文件签署我的应用程序