Flutter web 无法从另一个域加载网络图像

Abe*_*lew 29 flutter flutter-web

我无法通过 API 调用从其他域加载 flutter web 中的网络图像。收到这个错误

试图从另一个域加载图像?在以下位置找到答案: https: //flutter.dev/docs/development/platform-integration/web-images ImageCodecException:无法加载网络图像。

有什么帮助吗?

J3n*_*sis 44

为了能够在 Flutter 网页上显示来自任何其他域或 Firebase 存储的图像,您必须为CORS配置数据。

  1. 打开GCP 控制台,选择您的项目并通过单击>_顶部导航栏中的图标按钮启动云终端会话。

  2. 单击打开编辑器按钮(铅笔图标),然后创建cors.json文件。

cors.json文件应如下所示:

[
  {
    "origin": ["*"],
    "method": ["GET"],
    "maxAgeSeconds": 3600
  }
]
Run Code Online (Sandbox Code Playgroud)

我将原点设置为*这意味着每个网站都可以显示您的图像。但是您也可以在那里插入您网站的域来限制访问。

  1. gsutil cors set cors.json gs://your-bucket

如果您需要更多信息:https : //cloud.google.com/storage/docs/configuring-cors

  • 要验证:`gsutil cors get gs://your-bucket` (9认同)
  • 在第 2 步中,为了创建 cors.json 文件,请单击与 Explorer:XXXX 同一行的 3 个点 (...),或者只需单击“文件”>“新文件”。第 3 步:您将在 Firebase STORAGE 控制台中找到“your-bucket”,并且在运行 shell 命令时必须进行授权。 (5认同)
  • 在执行上述所有建议后仍然无法正常工作,尝试在我的 flutter web 应用程序中显示 YouTube 缩略图。我在第 3 点之后是否遗漏了某些内容。是否需要执行任何重新加载或刷新命令。请建议我。 (3认同)
  • 对于像我这样对存储桶一无所知并收到 403 错误的人,您可以使用 ``gsutil ls``` 获取存储桶列表,然后检查您的应用程序使用哪一个存储桶列表,并为该存储桶设置 cors.json。 (3认同)

Eha*_*eda 34

只需将其添加到您的 Flutter ( web/index.html) 中:

<script type="text/javascript">
    window.flutterWebRenderer = "html";
</script>
Run Code Online (Sandbox Code Playgroud)


mah*_*mnj 28

取自文档

CORS 是浏览器用来控制一个站点如何访问另一个站点资源的机制。它被设计为默认情况下不允许一个网站使用 XHR 或 fetch 向另一个网站发出 HTTP 请求。这可以防止另一个站点上的脚本代表用户执行操作并防止未经许可访问另一个站点的资源

使用 <img>、<picture> 或 <canvas> 时,当浏览器知道图像来自另一个站点并且 CORS 策略不允许访问数据时,它会自动阻止对像素的访问。

Flutter 有两个 Web 渲染器,canvaskit 和 html。当您在 Flutter Web 上运行/构建应用程序时,它使用基于运行设备的渲染器。

HTML 渲染器:当应用程序在移动浏览器中运行时。

CanvasKit 渲染器:当应用程序在桌面浏览器中运行时。

HTML 渲染器无需额外配置即可加载跨源图像。所以你可以使用这些命令来运行和构建应用程序。

flutter run -d chrome --web-renderer html // to run the app

flutter build web --web-renderer html --release // to generate a production build
Run Code Online (Sandbox Code Playgroud)

来源:https : //flutter.dev/docs/development/tools/web-renderers


小智 25

如果您使用 Firebase 存储,只需按照以下步骤操作:

  1. 在您的项目中打开Google Cloud Console 。

  2. 单击右上角的控制台图标。

  3. 单击打开编辑器。

  4. 单击文件->新建->cors.json。

  5. 将代码放在下面:

    [
      {
        "origin": ["*"],
        "method": ["GET"],
        "maxAgeSeconds": 3600
      }
    ]
    
    Run Code Online (Sandbox Code Playgroud)
  6. 然后在控制台中运行:

    gsutil cors set cors.json gs://bucket-name
    
    Run Code Online (Sandbox Code Playgroud)

    bucket-name是存储桶的名称,您可以在 Firebase 项目的存储部分文件夹上方找到该存储桶。


Mic*_*erg 19

为我flutter run -d chrome --web-renderer html工作。

  • 但它在生产中有效吗? (3认同)
  • 这些参数在部署时有效。您只需要在构建期间添加相同的参数`flutter build web --web-renderer html` (2认同)

Abe*_*lew 17

我通过使用 html 渲染器解决了这个问题

flutter build web --release --web-renderer html
Run Code Online (Sandbox Code Playgroud)

或者

flutter run --web-renderer html

  • 它会使图像和文本密度变得如此糟糕...请不要使用那种类型的渲染 (4认同)

Oma*_*att 11

为了快速调试,flutter run -d chrome --web-renderer html您还可以在运行配置中添加参数,而不是从终端运行--web-renderer html。在菜单栏上,浏览Run > Edit Configurations

运行配置


Nut*_*uts 8

如果您无法更新 CORS 设置或添加代理,请选择 CanvasKit(具有更好的性能)而不是 HTML 渲染器 - 可以使用平台视图显示图像:

import 'dart:html';
import 'package:flutter/material.dart';
import 'dart:ui' as ui;

class MyImage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    String imageUrl = "image_url";
    // https://github.com/flutter/flutter/issues/41563
    // ignore: undefined_prefixed_name
    ui.platformViewRegistry.registerViewFactory(
      imageUrl,
      (int _) => ImageElement()..src = imageUrl,
    );
    return HtmlElementView(
      viewType: imageUrl,
    );
  }
}


Run Code Online (Sandbox Code Playgroud)

  • 我想添加像图像小部件这样的适合属性,知道如何添加它吗? (2认同)

kag*_*ker 7

终极解决方案

使用这个包代替flutter的Ne​​tworkImage。

https://pub.dev/packages/image_network

使用 Canvas 渲染器在 Flutter Web 上进行测试,效果非常好!