我无法通过Flutter Web从其他域名使用API调用加载网络图片,出现以下错误:
尝试从另一个域名加载图像?请访问: https://flutter.dev/docs/development/platform-integration/web-images ImageCodecException: 无法加载网络图片。
需要帮助吗?
我无法通过Flutter Web从其他域名使用API调用加载网络图片,出现以下错误:
尝试从另一个域名加载图像?请访问: https://flutter.dev/docs/development/platform-integration/web-images ImageCodecException: 无法加载网络图片。
需要帮助吗?
Open the GCP console, select your project and start a cloud terminal session by clicking the >_ icon button in the top navbar.
Click the open editor button (pencil icon), then create the cors.json
file.
The cors.json
file should look like this:
[
{
"origin": ["*"],
"method": ["GET"],
"maxAgeSeconds": 3600
}
]
I set the origin to *
which means that every website can display your images. But you can also insert the domain of your website there to restrict access.
Run gsutil cors set cors.json gs://your-bucket
如果您需要更多信息:https://cloud.google.com/storage/docs/configuring-cors
gsutil cors get gs://your-bucket
- Liel van der Hoevengsutil ls
命令获取你的存储桶列表,并检查哪一个被你的应用程序使用,然后为该存储桶设置cors.json文件,以解决问题。 - Ali Azimoshan解决此问题有两种方法,一种是使用HTML渲染器运行您的应用程序,另一种是设置CORS配置。
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
来源: https://docs.flutter.dev/development/tools/web-renderers
cors.json
的文件,并添加以下JSON内容,这将删除所有域限制。(无论此文件位于何处)[
{
"origin": ["*"],
"method": ["GET"],
"maxAgeSeconds": 3600
}
]
gcloud init
(位于google-cloud-sdk/bin
)。
通过点击链接进行身份验证,并在控制台中选择项目。
最后执行gsutil cors set cors.json gs://<your-bucket-name>.appspot.com
。您可以在Firebase存储中找到您的存储桶名称。
我已经在github gists中记录了整个过程。cors.json
文件放在哪里?(这有关系吗?) - Yves Boutelliergsutil
命令,cors.json
就不再重要了。 - Mahesh Jamdadecors.json
文件了。 - Mahesh Jamdade我通过使用HTML渲染器解决了这个问题:
flutter build web --release --web-renderer html
或者flutter run --web-renderer html
只需在您的 Flutter 代码 (web/index.html
) 中添加以下内容:
<script type="text/javascript">
window.flutterWebRenderer = "html";
</script>
对我来说,这个方法有效:
flutter run -d chrome --web-renderer html
flutter build web --web-renderer html
即可。 - Omatt如果您使用Firebase存储,请按照以下步骤操作:
在您的项目中打开Google Cloud控制台。
点击右上角的控制台图标。
点击“打开编辑器”。
点击“文件 > 新建 > cors.json”。
粘贴下面的代码:
[
{
"origin": ["*"],
"method": ["GET"],
"maxAgeSeconds": 3600
}
]
然后在控制台中运行:
gsutil cors set cors.json gs://bucket-name
bucket-name
是存储桶的名称,您可以在Firebase项目中的存储部分文件夹上方找到它。
终极解决方案
使用此软件包代替Flutter的NetworkImage。
https://pub.dev/packages/image_network
已在使用Canvas渲染器的Flutter Web上进行测试,效果非常好!
如果您无法更新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,
);
}
}
运行中
flutter run --web-renderer html
解决了我的问题。