Flutter Web:图片相关及跨域问题

news2024/12/28 10:54:55

加载网络图片

在flutter web上也可以使用Image这个widget来加载显示图片。但是涉及到网络图片的时候就可能会出现问题,现象是不显示图片,控制台报错:

Failed to load network image.

Image URL: https://cdnimagelive.knowbox.cn/image/784111920965119.png

Trying to load an image from another domain? Find answers at:

https://flutter.dev/docs/development/platform-integration/web-images

看提示应该与跨域有关,根据官网的相关文档,Image这个widget在web上支持有限,这时候建议使用其他方式来加载图片

The web offers several methods for displaying images. Below are some of the common ones:

The built-in and HTML elements.

The drawImage method on the element.

Custom image codec that renders to a WebGL canvas.

我们选择使用img标签来显示,通过ImageElements来实现即可,代码如下:

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

class WebImage extends StatelessWidget{
  String url;
  double width;
  double height;

  WebImage(this.url, this.width, this.height);

  
  Widget build(BuildContext context) {
    String _divId = "web_image_" + DateTime.now().toIso8601String();
    // ignore: undefined_prefixed_name
    ui.platformViewRegistry.registerViewFactory(
      _divId,
          (int viewId) => ImageElement(src: url),
    );
    return SizedBox(
      width: width,
      height: height,
      child: HtmlElementView(key: UniqueKey(),
        viewType: _divId,),
    );
  }

}

注意,这种方式图片不能按照自身尺寸显示,所以必须设置宽高才可以。

如果想使用圆形图片,则用ClipOval包装即可,如下:

ClipOval(
  child: WebImage("https://cdnimagelive.knowbox.cn/image/784111920965119.png", 50, 50)
)

HTML renderer

但是上面方式有一个很严重的问题,如果一个页面中图片特别多,比如列表,那么使用这种方式的话在pc上运行会特别卡,甚至卡死。会出现大量如下信息:

Flutter: restoring WebGL context.

Flutter: restoring WebGL context.

Flutter: restoring WebGL context.

════════ Exception caught by scheduler library ═════════════════════════════════════════════════════

The following JSNoSuchMethodError was thrown during a scheduler callback:

TypeError: Cannot set property ‘name’ of null

When the exception was thrown, this was the stack:

https://unpkg.com/canvaskit-wasm@0.24.0/bin/canvaskit.js 223:448 ga

https://unpkg.com/canvaskit-wasm@0.24.0/bin/canvaskit.js 1:1 Surface$_flush

https://unpkg.com/canvaskit-wasm@0.24.0/bin/canvaskit.js 12:230 flush

lib/_engine/engine/canvaskit/surface.dart 290:14 flush

lib/_engine/engine/canvaskit/surface.dart 266:5 [_presentSurface]


════════════════════════════════════════════════════════════════════════════════════════════════════

其实在上面的官方文档(https://flutter.dev/docs/development/platform-integration/web-images )中已经提到了

As of today, using too many HTML elements with the CanvasKit renderer may hurt performance. If images interleave non-image content Flutter needs to create extra WebGL contexts between the elements. If your application needs to display a lot of images on the same screen all at once, consider using the HTML renderer instead of CanvasKit.
如果在一个页面有很多图片,则使用HTML renderer来代替CanvasKit。

那么什么是HTML renderer,什么是CanvasKit,如何使用这两个?

根据https://flutter.cn/docs/development/tools/web-renderers 官方文档,flutter对于web的渲染是有两种模式,即html和Canvaskit。

Canvaskit将 Skia 编译成 WebAssembly 格式,并使用 WebGL 渲染。应用在移动和桌面端保持一致,有更好的性能,以及降低不同浏览器渲染效果不一致的风险。但是应用的大小会增加大约 2MB。

默认情况下flutter自动选择渲染器。移动端浏览器选择 HTML,桌面端浏览器选择 CanvasKit。

但是我们如果想使用HTML renderer,就必须强制设置一下,而这个设置并不是在代码中,而是在启动参数中,如下

flutter run -d chrome --web-renderer html (或canvaskit)//运行命令

flutter build web --web-renderer html (或canvaskit) //编译打包
我们通过在终端执行flutter run -d chrome --web-renderer html 来运行我们的应用,就会发现即使页面中有很多图片,也不会出现明显卡顿卡死的现象了。

如果使用Android studio,则需要对运行进行配置,如图:

5EC47B15-1734-47A3-97F5-EF71F551A55E.png

在配置中的Additional arguments一栏中添加--web-renderer html即可,再运行就会以HTML renderer的方式来运行。

最后编译打包的时候也要加上--web-renderer html才可以。

后续影响

慢慢的,使用html render的问题就显示出来了:

Shadow Root问题导致很多三方js sdk无法使用

见《flutter web:解决document.getElementById找不到节点的问题(Shadow Root问题)》

文本无法选择

改成html render后发现所有文字无法选择了,导致无法进行复制等行为。
运行后通过开发者工具查看页面节点信息,可以看到

整个body都被设置成了user-select: none; touch-action: none,这样就导致整个页面上的文本都无法选择。

这个是flutter框架的行为,目前在flutter项目中还没有发现可以取消这个配置的api。

关注公众号:BennuCTech,获取更多干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年上半年软考高项报名条件-信息系统项目管理师

信息系统项目管理师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资…

62 序列到序列学习(seq2seq)【动手学深度学习v2】

62 序列到序列学习(seq2seq)【动手学深度学习v2】 深度学习学习笔记 学习视频:https://www.bilibili.com/video/BV16g411L7FG/?spm_id_fromautoNext&vd_source75dce036dc8244310435eaf03de4e330 一个句子翻译到另一个句子。 seq2seq 最早…

经典网络模型系列——Swin-Transformer详细讲解与代码实现

经典网络模型系列——Swin-Transformer详细讲解与代码实现一、网路模型整体架构二、Patch Partition模块详解三、Patch Merging模块四、W-MSA详解五、SW-MSA详解masked MSA详解六、 Relative Position Bias详解七、模型详细配置参数八、重要模块代码实现:1、Patch P…

Android开发【金三银四】之OKhttp网络通讯socket

一、SOCKS代理 全能代理,就像有很多跳线的转接板,它只是简单地将一端的系统连接到另外一端。支持多种协议,包括http、ftp请求及其它类型的请求。它分socks 4 和socks 5两种类型,socks 4只支持TCP协议而socks 5支持TCP/UDP协议&am…

Java后端开发功能模块思路

文章目录前言一、查找接口及参数信息1.1 找访问路径1.2 参数及返回结果信息1.3 编写功能模块函数二、代码设计思路三、总结前言 对于正在学习Java后端开发的同学来说,对于Java后端功能模块的开发过程及思路要有一个整体清晰的流程。才能保证在开发过程中更加的顺畅…

哪些数据可以用在二手车买卖中?

近期,商务部副部长盛秋平表示,将着力稳定和扩大汽车消费,支持新能源汽车购买使用,扩大二手车流通。还将打通二手车信息平台,推广上海的汽车全生命周期信息平台和中国汽车流通协会有关经验做法,建设全国性的…

Python-项目实战--飞机大战-游戏背景(5)

目标背景交替滚动的思路确定显示游戏背景1.背景交替滚动的思路确定游戏启动后,背景图像会连续不断地向下方移动在视觉上产生英雄的飞机不断向上方飞行的错觉 -- 在很多跑酷类游戏中常用的套路游戏的背景不断变化游戏的主角位置保持不变1.1实现思路分析解决办法创建两…

计算机视觉框架OpenMMLab开源学习(三):图像分类实战

前言:本篇主要偏向图像分类实战部分,使用MMclassification工具进行代码应用,最后对水果分类进行实战演示,本次环境和代码配置部分省略,具体内容建议参考前一篇文章:计算机视觉框架OpenMMLab开源学习&#x…

计算机网络整理-问答

1. 程序工作的时候网络各层的状态 如下图所示: 1. TCP 在进行三次握手的时候,IP 层和 MAC 层对应都有什么操作呢? TCP 三次握手是通过在传输层建立连接的一个过程,在这个过程中,TCP 和 IP 层、MAC 层都起到了重要的…

ChatGPT API 本地如何调用

本文将会介绍,如何找到API文档和相应语言SDK,并使用PHP调用SDK实现本地请求API的完成过程及遇到的问题和解决方法。 API文档 1.打开官网 ChatGPT: Optimizing Language Models for Dialogue 2.找到API 3.查看文档 4.找到sdk库 OpenAI API 5.主流语言 …

2023年软考什么时候考试?

2023年软考各科目考试时间安排已确定!中国计算机技术职业资格网发布了《2023年度计算机技术与软件专业技术资格(水平)考试工作计划》,具体见下文。2023年度计算机软件资格考试(初级、中级、高级)上半年考试…

树莓派4b Raspberry Pi 4安装以前内置Python3.7版本的系统出现的一系列问题记录

今天想要重装树莓派系统,想装那种内置Python3.7版本的系统,从网上找到镜像源后烧录进去出现一系列问题: 烧录系统开机后,首先就出现报错: 上面显示一个问题就是:start4x.elf: is not compatible&#xff0…

Django自定义模板标签的使用详解

目录 1.创建子应用:python manage.py startapp test01 2.进行相关的配置 3.在新建的test01文件下创建urls.py(此处名称可变但注意上图) 4.在test01文件下创建名称为templatetags的文件夹 5.templatetags文件下继续创建几个py文件如下图​编辑 6.views视图函数…

走进独自开,带你轻松干副业

今天给大家分享一个开发者的福利平台——独自开(点击直接注册),让你在家就能解决收入问题。 文章目录一、平台介绍二、系统案例三、获取收益四、使用平台1、用户注册2、用户认证3、任务报价五、文末总结一、平台介绍 简单说明 独自开信息科技…

人工智能的未来———因果推理what if 第11章(统计模型) 文章解读

我们在观察数据当中,一般使用样本均值去估计目标人群的均值 在所有情况都是理想的情况下: 平均因果效应

Linux环境运行Maven 生成的hadoop jar包

运行命令: hadoop jar ./jar包名字 class对象路径 输入路径 输出路径 linux内部jar包测试 cd 到以下目录,创建以下文件夹 [rootreagan180 ~]# cd /opt/soft/hadoop313/share/hadoop/mapreduce/ 创建文件夹(读取路径) [roo…

ETL基础概念及要求详解

ETL基础概念及要求详解概念ETL与ELT数据湖与数据仓库ETL应用场景ETL具体流程及操作要求抽取清洗转换加载ETL设计模式SQL脚本语言ETL工具设计ETL工具SQLETL接口设计要求明确接口属性约定接口形式确定接口抽取方法规范接口格式概念 ETL即Extract(抽取)Tra…

Python学习-----无序序列1.0(字典的创建、查看、添加、修改、删除/替换)

目录 前言: 字典是什么 字典的特点 1.字典的创建 (1)直接创建{} (2)dict() 函数创建 2.字典的查询 (1)get()函数 (2)获取字典一组内容 3.字典键值对的添加 &a…

1CN/Jaccard/PA/AA/RA/Katz/PageRank/SimRank

common neighbors(CN) 公共邻居的数量。 Jaccard 用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大,样本相似度越高。 preferential attachment(PA) 节点倾向于连接到节点度较高的节点上,&…

BSN-DDC基础网络详解(二):快速接入指南

本文将为大家介绍BSN算力中心方和DDC网络平台方接入DDC网络的基本流程,如下图所示,算力中心方和平台方依次执行图内左侧流程,右侧流程由DDC网络运营人员操作。01注册门户账号注册在接入之前,算力中心方和平台方需要先注册一个官方…