首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Flutter WebView跳过了30帧!应用程序可能在其主线程上做了太多的工作

基础概念

Flutter 是一个用于构建跨平台移动应用的 UI 工具包,而 WebView 是一个用于在应用中显示网页内容的组件。Flutter WebView 通过将网页内容嵌入到 Flutter 应用中,允许开发者展示网页而不需要离开应用。

问题原因

当 Flutter WebView 跳过帧(即出现卡顿)时,通常是因为主线程上的工作量过大,导致无法在每一帧的 16.67 毫秒内完成渲染任务。这可能是由于以下原因造成的:

  1. JavaScript 执行密集:如果网页中的 JavaScript 代码执行效率低下或者执行了大量计算,它会阻塞主线程。
  2. 资源加载:大量图片或其他资源的加载会消耗主线程的时间。
  3. 渲染问题:复杂的 CSS 动画或者大量的 DOM 元素也可能导致渲染瓶颈。
  4. Flutter 代码问题:Flutter 应用本身的代码如果执行效率低,也可能影响 WebView 的性能。

解决方法

优化网页内容

  • 减少 JavaScript 工作量:优化 JavaScript 代码,减少不必要的计算,使用 Web Workers 将计算任务移到后台线程。
  • 优化资源加载:压缩图片和其他资源,使用懒加载技术,减少初始加载时间。
  • 简化 CSS 动画:避免使用过于复杂的 CSS 动画,或者使用 will-change 属性来提示浏览器哪些元素将会变化。

优化 Flutter 应用

  • 异步处理:使用 Futureasync/await 来处理耗时操作,避免阻塞主线程。
  • 使用 compute 函数:对于一些可以在后台线程执行的任务,可以使用 Flutter 的 compute 函数。
  • 减少不必要的重绘:避免在 Flutter 中频繁触发 UI 更新。

使用性能监控工具

  • Flutter DevTools:使用 Flutter DevTools 中的性能监控面板来分析应用的性能瓶颈。
  • Chrome DevTools:通过 Chrome DevTools 的性能面板来分析 WebView 中网页的性能问题。

示例代码

以下是一个简单的 Flutter 应用示例,展示了如何使用 compute 函数来异步处理数据:

代码语言:txt
复制
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter WebView Example')),
        body: MyWebView(),
      ),
    );
  }
}

class MyWebView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<String>(
      future: compute(loadHtml, 'https://example.com'),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Center(child: CircularProgressIndicator());
        } else if (snapshot.hasError) {
          return Center(child: Text('Error: ${snapshot.error}'));
        } else {
          return WebView(
            initialUrl: 'data:text/html;base64,${base64Encode(const Utf8Encoder().convert(snapshot.data ?? ''))}',
            javascriptMode: JavascriptMode.unrestricted,
          );
        }
      },
    );
  }

  static Future<String> loadHtml(String url) async {
    // 这里应该是从网络加载 HTML 的逻辑
    // 为了示例,我们简单返回一个字符串
    return '<html><body><h1>Hello, WebView!</h1></body></html>';
  }
}

参考链接

请注意,以上代码仅为示例,实际应用中需要根据具体情况进行调整和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)

为什么 iOS 上相对稳定,文中也做了对应介绍。... WebViewFlutter 是通过将 Widget Tree 转化为纹理后通过 Skia 实现控件绘制,这造就了优秀跨平台效果同时,也带来了不可逆兼容问题。...所以这样好处就是:需要在“iOS平台”视图下方呈现Flutter UI,最终会被绘制到其下方纹理上;而需要在“平台”上方呈现Flutter UI,最终会被绘制在其上方纹理。...设置一个代理 View ,该 View 与 WebView 在相同线程侦听输入连接。...在代理线程中,返回 Flutter View 以创建输入。。 WebView 失去焦点时,将输入连接重置回 Flutter 线程。这样可以防止文本输入“卡”在 WebView 内。

13.4K20

Flutter 1.22 正式发布

,一个稳定Platform Views版本(Google Maps和WebView插件基础)以及一个开关,您可以在其中添加代码以改善在具有高频率显示设备滚动。...您可以在iOS 14尝试使用Flutter另一个功能是App Clips,它是iOS 14一项新功能,它支持10MB以下轻量级应用程序快速,无安装应用程序执行。...Navigator 2.0 如果您以前在Flutter应用程序中使用过导航功能,则可能已经注意到核心数据结构(用户正在浏览页面堆栈)对您而言是隐藏。...此时,Android将终止并恢复您应用程序,因此您可以查看一切是否按预期工作。 ? 尽管我们很高兴将状态恢复预览版放在您手中,但还有更多工作要做。...Flutter惊人发展速度意味着我们能够为iOS和Android实施屡获殊荣设计,并且还可以发布到Web—及时锁定!通常,这实际是不可能

7.5K20
  • Flutter 深入探索混合开发技术演进

    所以这样好处就是: 需要在 “iOS平台” 视图下方呈现Flutter UI,最终会被绘制到其下方纹理上; 而需要在 “平台” 上方呈现 Flutter UI,最终会被绘制在其上方纹理; iOS...是在 raster 线程被调用,不同线程调用时可能导致:当 attachToGLContext被调用时 texture 已经被释放了,所以需要 SurfaceTextureWrapper 用于实现 Java...例如在不使用 Hybrid Composition 情况下,Flutter App 中 UI 是在特定光栅线程运行,所以 Flutter App 本身线程很少受到阻塞。...例如在 Android 10 之前, Hybrid Composition 需要将内存中每个 Flutter 绘制帧数据复制到内存,之后再从 GPU 渲染复制回来 ,所以也会导致 Hybrid...PS ,如果这个修改正式发布,可能 Flutter Android miniSDK 版本就需要到 23 起步了。

    1.1K20

    Flutter 2.8 release 发布,快来看看新特性吧

    与往常一样,Flutter 工作第一位就是保证质量,我们花费了大量时间来确保 Flutter 在支持设备范围内可以尽可能平稳和稳健地运行。...出于严谨考虑,在之前版本中 Flutter 创建平台视图时会阻塞平台线程,这次通过详细推理和测试 确定了可以删除一些序列化,这个改进消除了在低端设备启动 Google Pay 期间超过 100...image.png 此外为了创建更少卡顿动画效果,开发者可能会想要更多关于光栅缓存行为性能跟踪信息,因为这个行为对于 Flutter 来说是比较昂贵,可以重复使用图片进行 blit, 而不是在每一帧重新绘制它们...WebView 3.0 这次 webview_flutter 另一个新版本是,这里提高了版本号,是因为新功能数量增加了,而且还因为 Web 视图在 Android 工作方式可能发生了重大变化。...运行时它也会按开发者预期工作: image.png 请注意,其实当前 webview_flutter for web 实现还有许多限制,因为它是使用 构建 iframe 实现

    4.2K20

    跨平台解决方案技术分析

    Web 渲染方案本质是依托原生应用内嵌浏览器控件 WebView 去渲染 H5 页面,因此 h5 App 渲染流水线和 Web 页面渲染相一致,能力也局限在 WebView 这一沙箱。...上面所描述是最为原始 Web 渲染方案,在这基础业内又提出 h5 容器技术解决方案,h5 容器提供丰富内置 JSAPI,增强版 WebView 控件以及插件机制等能力,对原始版本方案做了进一步功能高内聚和模块低耦合...图片来源:Cordova 官网 Cordova 应用程序由几部分组成: Web App 应用程序代码实现地方,采用是 Web 技术,应用运行在原生控件 WebView 中 HTML Rendering...下面从线程模型机制,分析一下 Flutter App 运行机制: Platform 线程 Flutter 线程,由 Native 创建。...通过分析不同跨平台解决方案,单纯性能和体验考虑,自建渲染引擎是当前一个较优解,虽然目前 Flutter 动态化能力还不算出色,但是其架构思路或许能够启发我们,去设计一套权衡不同维度框架出来

    1.2K20

    跨平台解决方案技术分析

    Web 渲染方案本质是依托原生应用内嵌浏览器控件 WebView 去渲染 H5 页面,因此 h5 App 渲染流水线和 Web 页面渲染相一致,能力也局限在 WebView 这一沙箱。...上面所描述是最为原始 Web 渲染方案,在这基础业内又提出 h5 容器技术解决方案,h5 容器提供丰富内置 JSAPI,增强版 WebView 控件以及插件机制等能力,对原始版本方案做了进一步功能高内聚和模块低耦合...图片来源:Cordova 官网 Cordova 应用程序由几部分组成: Web App 应用程序代码实现地方,采用是 Web 技术,应用运行在原生控件 WebView 中 HTML Rendering...下面从线程模型机制,分析一下 Flutter App 运行机制: Platform 线程 Flutter 线程,由 Native 创建。...通过分析不同跨平台解决方案,单纯性能和体验考虑,自建渲染引擎是当前一个较优解,虽然目前 Flutter 动态化能力还不算出色,但是其架构思路或许能够启发我们,去设计一套权衡不同维度框架出来

    1.4K20

    跨平台技术演进及Flutter未来

    StackOverflow 2019年全球开发者文件调查中,Flutter被评选为最受开发者欢迎框架之一,超过了TensorFlow和Node.js。 ?...在2019 Google I/O 开发者大会上推出使用 Flutter 开发 Web 应用框架,同年9月发布Flutter 1.9,并将Flutter web合入Flutter仓库。 ?...Platform Task Runner:运行在Android或者iOS线程,尽管阻塞该线程并不会影响Flutter渲染管道,平台线程建议不要执行耗时操作;否则可能触发watchdog来结束该应用。...Widget是所有Flutter应用程序基石,Widget可以是一个按钮,一种字体或者颜色,一个布局属性等,在FlutterUI世界可谓是“万物皆Widget”。...开发者编写Widget控件如何渲染到屏幕Flutter如何通过plugin支持移动设备提供服务?

    2K10

    Flutter常见开发问题

    这是一个让我印象深刻工具,很想看看它是如何发展。 链接:https : //flutterstudio.app Flutter 是否像浏览器一样工作?.../ 它与基于 WebView 应用程序有何不同? 简单地回答这个问题:您为 WebView 或类似运行应用程序编写代码必须经过多个层才能最终执行。...Flutter 应用程序运行速度比它们混合应用程序快得多。此外,使用插件访问原生组件和传感器比使用无法充分利用其平台 WebView 更容易。...Android 和 iOS 文件夹存在是为了在各自平台上实际构建应用程序,并在其运行 Dart 文件。它们还帮助您向项目添加权限和特定于平台功能。...使用 Android (<Java 8) 等接口回调对于简单回调有太多样板代码。

    6.8K30

    Flutter常见开发问题

    这是一个让我印象深刻工具,很想看看它是如何发展。 链接:https : //flutterstudio.app Flutter 是否像浏览器一样工作?.../ 它与基于 WebView 应用程序有何不同? 简单地回答这个问题:您为 WebView 或类似运行应用程序编写代码必须经过多个层才能最终执行。...Flutter 应用程序运行速度比它们混合应用程序快得多。此外,使用插件访问原生组件和传感器比使用无法充分利用其平台 WebView 更容易。...Android 和 iOS 文件夹存在是为了在各自平台上实际构建应用程序,并在其运行 Dart 文件。它们还帮助您向项目添加权限和特定于平台功能。...使用 Android (<Java 8) 等接口回调对于简单回调有太多样板代码。

    6.7K20

    桌面软件开发框架大赏

    自绘引擎用是Googleskia,这个自绘引擎稳很,Chrome和Flutter都是用它, 所以绘制、渲染之类工作不太会出问题。比Java生态圈里Swing和JavaFx要好很多。...由于flutter在移动端积累了很多年,所以界面上一些东西在desktop端都比较稳(skia自绘引擎), 与操作系统相关东西还不成熟,生态也不太好, 比如你想订制一下窗口标题栏,想访问一下注册表这类工作可能得自己想办法...使用flutter-desktop开发应用程序打包后体积还比较大 webview2 https://developer.microsoft.com/zh-cn/microsoft-edge/webview2..., Mac使用Cocoa/WebKit,Linux使用gtk-webkit2,Windows 10使用Edge(也就是上一个小节里提到webview2), 它是不支持Win7。...开发者不能在处理用户业务逻辑时候,让界面渲染工作阻塞, 这就需要一个强大异步、并行处理机制, 如果让开发者自己去创建线程并完成这些工作,无疑是又麻烦又会增加开发者心智负担。

    6.9K30

    跨平台技术演进

    但它包含View视图层、App Service逻辑层两部分,分别独立运行在各自WebView线程中。 View 可以理解为h5页面,提供UI渲染。...也就是说仍不能真正实现严格意义“一套代码,多平台使用”。另外,因为仍对ios 和android原生细节有所依赖,所以需要开发者若不了解原生平台,可能会遇到一些坑。...改变线程模式。UI 更新不再同时需要在三个不同线程触发执行,而是可以在任意线程同步调用 JavaScript 进行优先更新,同时将低优先级工作推出主线程,以便保持对 UI 响应。...Embedder:是一个嵌入层,即把Flutter嵌入到各个平台上去,这里做主要工作包括渲染Surface设置,线程设置,以及插件等。...在 Android,v8 Native Binding可以很好地实现,但是 iOS JavaScriptCore不可以,所以如果使用 JavaScript,Flutter 基础框架代码模式就很难统一了

    2.4K20

    Flutter 2.8正式版发布了,还不来看看

    我们对 Flutter 调用 Dart VM GC 策略也做了一些改进,以此避免在程序启动期间出现不合时宜 GC。...在 Flutter 2.8 版本中,Android 设备 Dart VM 服务 isolate 已被拆分至单独 bundle 中,可以单独加载,减少了在其加载前约 40MB 内存使用。...因为新功能数量增加,我们提升了主要版本号,但也因为 Web 视图在 Android 工作方式可能发生了重大变化。...运行时,它会按你预期工作: 请注意,当前 webview_flutter web 实现有许多限制,因为它是使用 iframe 构建, iframe 仅支持简单 URL 加载,无法控制加载内容或与加载内容交互...通过放弃维护这个渠道,开发者们也可以少做一个渠道选择决定,同时 Flutter 团队也可以将时间和精力花在其他事情。你可以使用 flutter channel 命令来决定你想要哪个渠道。

    22.4K30

    Rust 移动开发与跨平台模式探究

    另外,移动开发人员根本不想从事 C++ 项目,这也导致了移动开发人员离职。 如果写一次代码到处复用成本开销超过了其收益,就没有必要使用这种策略了。...FullSotry 公司面临问题可能更加复杂,因为它们是提供框架给别人去使用,而不是直接发布应用程序。...相关 flutter_rust_bridge 作者 fzyzcjy 也在和 AppFlowy 开发者沟通,后续 AppFlowy 有可能使用 flutter_rust_bridge,但目前这个进展比较缓慢...其他,比如底层音频库、I/O、Log处理、资源管理等都做了跨平台相关处理。 这些底层库实现跨平台模式和上面 Tauri 架构是相似的。...这是一项艰巨工作,但它会带来巨大投资回报。迁移到 Rust 可以消除 70% 漏洞,并且可能更接近 95% 可远程利用漏洞。专注于解析来自不受信任来源数据库将使Apple平台更加安全。

    3.2K50

    牛赞:音视频前端跨平台技术应用

    Flutter是近两年大火跨终端框架,实时音视频因为疫情缘故也越来越融入到人们日常工作生活中,如线上会议、在线教育等。两者结合起来可以碰撞起什么样火花呢?...UI渲染能力,使得Flutter编写UI能够在浏览器正常展示。...目前Flutter官方建议是FlutterWeb端适合以下三种场景: 使用Flutter构建渐进式Web应用程序; 单页应用程序; 将现有的移动应用程序发布到web。...WebApi和NativeApi差异比较大,所以我们在Web通信层也做了大量逻辑去抹平这里差异。...利用WebGpu/WebgGl图形渲染能力、TensorFlow机器学习能力和WebAssembly线程计算能力实现Web版本SDK的人像分割能力。

    2.6K10

    关于移动互联网跨平台技术演进

    但它包含View视图层、App Service逻辑层两部分,分别独立运行在各自WebView线程中。 View 可以理解为h5页面,提供UI渲染。...也就是说仍不能真正实现严格意义“一套代码,多平台使用”。另外,因为仍对ios 和android原生细节有所依赖,所以需要开发者若不了解原生平台,可能会遇到一些坑。...改变线程模式。UI 更新不再同时需要在三个不同线程触发执行,而是可以在任意线程同步调用 JavaScript 进行优先更新,同时将低优先级工作推出主线程,以便保持对 UI 响应。...Embedder:是一个嵌入层,即把Flutter嵌入到各个平台上去,这里做主要工作包括渲染Surface设置,线程设置,以及插件等。...在 Android,v8 Native Binding可以很好地实现,但是 iOS JavaScriptCore不可以,所以如果使用 JavaScript,Flutter 基础框架代码模式就很难统一了

    1.7K30

    基于小程序技术栈微信客户端跨平台实践

    基于消息和跨线程处理使得这种方式通信效率并不高,我们在骁龙845机器测了一组数据,一秒内通过 Platform Channel 只能大概完成四千次左右相互调用。 ?...有了这些基础 API 就基本可以做到 Dart 和 C/C++ 之间相互调用,但你可能还需要知道一些 DartVM 执行机制,才能让你代码正常 work。...当然还有一个重要概念是 Isolate,Dart 代码是运行在一个独立 Isolate 当中,在 Flutter 体系当中,这个 Isolate 一般是寄生在 UI Runner 线程中,...:Flutter 官方提供了较为完整输入框控件; 性能提升:相比 WebView 在低端机上有可见性能指标提升; 减少重复资源投入,多平台维护:基本只需要维护 Dart 和 C++ 代码,平台相关代码可以最小化...是否会放弃 WebView 渲染转向 Flutter 渲染? A1. 微信小程序是一个独立生态和产品,使用 WebView 渲染具有极大灵活性和前端兼容性,不会放弃 WebView 渲染。

    5.9K102

    客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析

    WPF不能运行在其他操作系统,并且在XAML中编写样式表,通用性还是不如HTML强,从学习应用范围来讲,还是HTML更好一些。...这个loadUrl实际就是加载webapp启动页(默认是index.html)。 IOS具体参看《Cordova 工作原理(IOS篇)》,这里关于原理这是简介。...Xamarin.Android被编译成中间语言,Xamarin在APK安装包中会包含一个mono(跨平台.NET运行环境),代码是在mono运行时和安卓本地运行时完成工作。...但是它也仅仅只是 UI 框架,比如 react-native 本身就是依赖于原生控件,而 flutter webview 、mapview 也都需要依赖原生开发来支撑。...而且实际Flutter是 Fuchisa OS应用框架概念一个子集。 Dart是类型安全语言,拥有完善包管理和诸多特性。

    14.5K30

    【译】Profiling Flutter Applications Using the Timeline

    它也是一个很好工具,可以识别出Flutter所提供所有特性相对性能成本,并允许您做出更明智决定,确定哪些地方需要避免某些特性,哪些地方需要使用可能会让您应用程序脱颖而出效果 ...., Dart code 也永远不可能会在 GPU线程 或者 IO 线程执行。...vsync事件指示Flutter引擎开始工作,最终在屏幕呈现新帧。...例如,在60Hz显示器,如果引擎仅在其他vsync脉冲上管道项开始工作,那么Flutter应用程序将呈现一致30Hz....在下面的例子中,在GPU线程渲染前,Flutter引擎正在UI线程生成下一帧。如果没有流,就很难将持续时间事件与特定框架工作负载关联起来。

    2.3K62

    从Hybrid到React-Native: JS在移动端南征北战史

    注:因为不了解Dart,所以本文不对flutter相关内容进行阐述, 实在抱歉 其实写这篇文章时候,我就知道,肯定有人问我:为什么不写flutter?...//my.html”); 2)webView.evaluateJavascript 上面的loadUrl有一个问题,它会导致页面刷新,而且通过加载文件方式执行JS代码总不是我们认为最优雅方式,我们可能期望是执行一段指定代码...方法调用JS方法,但前提是该JS方法在顶层Window对象 webview.stringByEvaluatingJavaScriptFromString("方法名(参数)”) Q4: JS怎么调用IOS...Shadow线程进行计算,并最终将计算结果得到布局参数传递给主线程(UI线程),实现UI构建 RN中Bridge做了什么? && RN线程如何交互?...,它们之间会通过序列化和反序列化方式交换消息 RN线程异步带来某些问题 && 未来解决方案 RN中JS线程和UI线程之间是没有同步方式,这可能造成一些问题,但RN未来Fabric也许能提供这一功能

    3.3K10

    浅谈Hybrid

    webview 基础,与原生客户端建立js bridge桥接,以达到 js 调用Native API和 Native 执行js方法目的。...“Learn once, write anywhere”,React Native采用了 React 设计模式,但 UI 渲染、动画效果、网络请求等均由原生端实现(由于 JS 是单线程,不大可能处理太多耗时操作...Flutter ? Flutter 是谷歌 2018 年发布跨平台移动 UI 框架。...通过更加定制化 JSBridge,并使用双 WebView线程模式隔离了 JS 逻辑与 UI 渲染,形成了特殊开发模式,加强了 H5 与 Native 混合程度,提高了页面性能及开发体验。...Native App 是一种基于智能手机本地操作系统如 iOS、Android、WP 并使用原生程式编写运行第三方应用程序,也叫本地 app。

    6.8K30
    领券