Flutter web:一些png资产未加载(404)状态

Posted

技术标签:

【中文标题】Flutter web:一些png资产未加载(404)状态【英文标题】:Flutter web: Some png assets not loaded (404) status 【发布时间】:2021-02-16 01:35:58 【问题描述】:

我为我的 Flutter 移动项目添加了 Web 支持。项目构建良好,在构建时没有错误或问题。

构建项目后,web 文件夹build 文件夹 内创建。在 web 文件夹内我有这些文件和文件夹:

$ ls
assets  favicon.png  flutter_service_worker.js  icons  index.html  main.dart.js  manifest.json  version.json

在assets文件夹里面,又是assets文件夹:

/build/web/assets
$ ls
AssetManifest.json  assets  FontManifest.json  fonts  NOTICES  packages

在这个assets里面,有project的assets:

/build/web/assets/assets
$ ls
fonts  images  male.svg  svgs  webfonts

我将图像和 svgs 文件夹复制到最后一个路径 /build/web/assets。然后我通过运行以下命令将 web 文件夹添加到 nginx 容器的 /usr/share/nginx/html 路径中:

docker run -it --rm -d -p 8081:80 --name web -v /mnt/Project/Flutter/Projects/app_web/build/web:/usr/share/nginx/html nginx

然后在 chrome 中这个 url http://localhost:8081/ 我看到了我的页面。

问题:

部分png状态文件在chrome的DevTools中有404。我看到这个网址http://localhost:8081/assets/assets/images/CardMask.png

CardMask.png 也存在于这个位置:

/build/web/assets/assets/images
$ ls -la
total 569
drwxrwxrwx 1 root root   4096 Nov  3 14:13 .
drwxrwxrwx 1 root root   4096 Nov  3 14:13 ..
-rwxrwxrwx 1 root root   4319 Nov  3 14:13 CardMask.png

在容器中:

root@442f35f12938:/usr/share/nginx/html# ls
assets       flutter_service_worker.js  index.html    manifest.json
favicon.png  icons          main.dart.js  version.json
root@442f35f12938:/usr/share/nginx/html# cd assets/
root@442f35f12938:/usr/share/nginx/html/assets# ls
AssetManifest.json  FontManifest.json  NOTICES  assets  fonts  images  packages  svgs
root@442f35f12938:/usr/share/nginx/html/assets# cd assets/
root@442f35f12938:/usr/share/nginx/html/assets/assets# ls
fonts  images  male.svg  svgs  webfonts
root@442f35f12938:/usr/share/nginx/html/assets/assets# cd images/
root@442f35f12938:/usr/share/nginx/html/assets/assets/images# ls
3DBoxes.png   Intersection.svg        bime.png     recieptPage.svg  tick.png
At3.svg       OperationMaskGroup.png  mahak.png    theme.jpg
CardMask.png  RightArcMask.png        receipt.png  theme1.png
root@442f35f12938:/usr/share/nginx/html/assets/assets/images# 

我在pubspec.yaml 中添加了 assets 文件夹,如下所示:

  assets:
    - assets/images/
    - assets/svgs/
    - assets/svgs/regular/
    - assets/fonts/
    - assets/webfonts/

有什么问题?

$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, 1.23.0-18.1.pre, on Linux, locale en_US.UTF-8)
[✓] android toolchain - develop for Android devices (Android SDK version 29.0.3)
[✓] Chrome - develop for the web
[✓] Android Studio (version 4.0)
[✓] VS Code (version 1.50.1)
[✓] Connected device (2 available)

• No issues found!

如何在此链接中删除 第二资产http://localhost:8081/assets/assets/images/CardMask.png

如果路径是http://localhost:8081/assets/images/CardMask.png,我可以看到我的png,但在http://localhost:8081/assets/assets/images/CardMask.png 中我得到了404

我正在使用此代码显示 png :

Align(
  alignment: Alignment.topLeft,
  child: ColorFiltered(
    colorFilter:
        ColorFilter.mode(widget.themeColor, BlendMode.srcATop),
    child: kIsWeb
        ? Image.network('assets/images/CardMask.png')
        : Image.asset('assets/images/CardMask.png'),
  ),
),

【问题讨论】:

您能否验证一下here 和here 这两个帖子中建议的解决方案 我检查了这些链接,但在我的结构中找不到问题。问题就在这里:如果链接是http://localhost:8081/assets/images/CardMask.png 一切都很好,但我不知道为什么链接是http://localhost:8081/assets/assets/images/CardMask.png?第二个资产是个问题@AbhilashChandran 【参考方案1】:

当我上传到运行 apache/nginx 的服务器时,我遇到了同样的问题。我必须手动将资产/资产中的所有文件和文件夹移动到资产。我不知道它是如何在我的 localhost 中运行的。

【讨论】:

【参考方案2】:

您可以检查 index.html 文件中的 Base href

<base href="/">

将 / 更改为您的路径/主机/域

【讨论】:

以上是关于Flutter web:一些png资产未加载(404)状态的主要内容,如果未能解决你的问题,请参考以下文章

Flutter web 无法从包中加载资产

Flutter:未处理的异常:无法加载资产

解决盒约束widget和assets里的加载资产技术在Flutter框架运用的方案Flutter高级技术

如何在 Flutter web 上显示资产图像?

Flutter web:如何将资产重定向到其他域?

Flutter - 加载资产进行测试