网页浏览速度太慢

时间:2019-04-09 08:07:14

标签: flutter

Web视图需要花费4秒钟以上的时间来加载网页。在本机应用程序中,同一页面的时间少于2秒。有没有一种方法可以加快加载时间。我尝试了官方webview_flutterflutter_webview_plugin

2 个答案:

答案 0 :(得分:0)

如果您的应用程序依赖于WebView,则只需选择其他工具:适用于iOS的Swift和适用于Android的Kotlin。

这是原因:

  1. WebView实际上不会缓慢加载页面。相反,创建WebView小部件很慢;

  2. 为了解决1,您可能需要使用缓存的WebView。不幸的是,这并不容易。布局更改(例如动画)可能会触发WebView“重新创建”(缓存的WebView无效/停滞)。而且“重新创建”非常缓慢;

  3. Flutter的窗口小部件取决于窗口小部件外部的“状态”,并且窗口小部件的创建被认为是快速/简单的。不幸的是,WebView(不是本机窗口小部件)不是这种情况。 WebView具有其复杂的内部“状态”,重新创建休闲类将丢弃所有内容,然后您将返回到WebView的初始状态(初始URL)。而且非常慢(创建时间+加载时间:网络开销);

  4. 很难在WebView外部创建“外部状态”,因此,在WebView重新创建之后,它无法从外部状态恢复;

  5. 由于WebView的重新创建非常缓慢,因此它完全杀死了动画并给用户带来了非常糟糕的体验。一种解决方案可能是将WebView作为您的主页,而从不尝试为新的WebView设置动画(就像YouTube中的Wiki App Demo)。

结论:

因此,现在,WebView尚未准备就绪,请不要考虑认真使用它。

讨论:

Flutter的小部件设计非常“不寻常”,因为它们基本上是不可变的。使用小部件外部的状态(外部状态)。当状态更改时,Flutter会选择基于新状态创建新的窗口小部件,而不是修改窗口小部件。因此,小部件的设计要轻巧,以便可以非常快速地创建/销毁它们。不幸的是,WebView不能属于这一类。 WebView与整个Flutter框架一样复杂,因此它不是本地窗口小部件,而是插件。 WebView具有其自己的内部状态,该状态与框架不兼容,从而导致框架不断破坏/重新创建。

我不确定为什么Flutter的窗口小部件是以这种方式设计的,也许创建框架更容易/更快?我看到了一些使用Redux / BLOC / Steam的复杂示例(约100行),只是为了“更改”小部件,而在其他框架中可能只需要一行代码即可。

性能也是一个问题。重建复杂的小部件树很慢。然后,您需要编写大量代码(Redux / BLOC / Stream / ScoppedModel ...),以实现部分小部件树构建。

即使对于非常简单的应用程序,Flutter的性能仍然不如本机(https://thoughtbot.com/blog/examining-performance-differences-between-native-flutter-and-react-native-mobile-development)。实际上,我想将Flutter视为“本机”,因为它被编译为机器代码而不是Java的ByteCode。

最后:

我是Flutter的新学习者,并且开始在Flutter玩了几周。小部件框架和WebView插件让我很头疼。在UI界面而不是我的应用程序的核心逻辑上花费了大量时间。

我并不是说Flutter不好。实际上,我认为这是适用于iOS / Android的最佳跨平台框架。在设计框架时可能没有考虑到某些因素(例如像WebView这样的复杂外部小部件)。希望Flutter团队能够找到解决方案,也许是处理复杂外部插件的特殊情况?

我将继续学习Flutter。/p>

答案 1 :(得分:0)

已更新为webview_flutter 1.0.x,并采用了Hybrid-Composition。现在,它在Android上的性能要好得多。