解决Electron应用中Lottie动画无法正常显示

简介: 我们用Flutter Web开发了一个应用,通过electron进行打包成可执行文件,但是在使用时发现了一个问题,Lottie动画无法显示。通过console的日志可以看到,提示lottie是undifine的,lottie是sdk提供的一个全局的对象,通过lottie.loadAnimation(options)可以加载显示Lottie动画,但是我们明明在index.html中引入了Lottie的js文件,而且在浏览器上也是可以正常使用的,为什么通过Electron打包后执行就失效了?

问题


我们用Flutter Web开发了一个应用,通过electron进行打包成可执行文件,但是在使用时发现了一个问题,Lottie动画无法显示。


通过console的日志可以看到,提示lottieundifine的,lottie是sdk提供的一个全局的对象,通过lottie.loadAnimation(options)可以加载显示Lottie动画,但是我们明明在index.html中引入了Lottie的js文件,而且在浏览器上也是可以正常使用的,为什么通过Electron打包后执行就失效了?


我们在开发者工具中的Sources下找到Lottie的js文件,然后打断点进调试,通过对比浏览器和Electron发现问题所在。

在Lottie的js文件一开始的代码:


(typeof navigator !== "undefined") && (function(root, factory) {
    if (typeof define === "function" && define.amd) {
        define(function() {
            return factory(root);
        });
    }
    else if (typeof module === "object" && module.exports) {
        module.exports = factory(root);
    }
    else {
        root.lottie = factory(root);
        root.bodymovin = root.lottie;
    }
}((window || {}), function(window) {
    ...
复制代码


这里会进行判断将factory(root)的结果赋值到不同的地方,而factory(root)就是下面的function(window) {..}函数,这个函数返回的就是lottie对象。在浏览器中代码会执行到第三个分支,即:


root.lottie = factory(root);
root.bodymovin = root.lottie;
复制代码


而在Electron中,代码执行到第二个分支中,这是因为在Electron中存在module这个全局变量,但是这个变量是Electron对象,所以将lottie赋值给它是错误的,全局就无法找到lottie对象了。


解决


简单的解决方法就是将第二条分支注释掉,因为我们在Electron中使用,所以问题不大。如下:

(typeof navigator !== "undefined") && (function(root, factory) {
    if (typeof define === "function" && define.amd) {
        define(function() {
            return factory(root);
        });
    }
    //在electron中本身有module的存在,所以会执行到这里,但是factory返回的lottie对象赋值到了错误的地方,导致全局lottie对象丢失
//    else if (typeof module === "object" && module.exports) {
//        module.exports = factory(root);
//    }
    else {
        root.lottie = factory(root);
        root.bodymovin = root.lottie;
    }
}((window || {}), function(window) {


目录
相关文章
|
8月前
|
JSON 编解码 前端开发
说lottie谁是lottie?
说lottie谁是lottie?
64 0
|
XML JSON 缓存
让UI忙碌的安卓Lottie动画渲染库(二)
上节我们讲述了Lottie开源库如何导入Android Studio但是,开源库是不断迭代的,所以我们也要及时更新
479 0
|
JSON 缓存 Android开发
iOS高质量的动画实现解决方案——Lottie
iOS高质量的动画实现解决方案——Lottie
1007 0
|
9月前
|
iOS开发
iOS (DZMCycleScrollView)无限滚动 - 无限轮播 - ScollView
iOS (DZMCycleScrollView)无限滚动 - 无限轮播 - ScollView
77 0
iOS (DZMCycleScrollView)无限滚动 - 无限轮播 - ScollView
flutter系列之:做一个下载按钮的动画
我们在app的开发过程中经常会用到一些表示进度类的动画效果,比如一个下载按钮,我们希望按钮能够动态显示下载的进度,这样可以给用户一些直观的印象,那么在flutter中一个下载按钮的动画应该如何制作呢? 一起来看看吧。
|
Java Spring
flutter系列之:使用AnimationController来控制动画效果
之前我们提到了flutter提供了比较简单好用的AnimatedContainer和SlideTransition来进行一些简单的动画效果,但是要完全实现自定义的复杂的动画效果,还是要使用AnimationController。 今天我们来尝试使用AnimationController来实现一个拖拽图片,然后返回原点的动画。
|
开发者 容器
Flutter常用的几种动画
Flutter 的动画系统可以帮助开发者创建流畅、生动的用户界面。下面是一些关于 Flutter 动画的详细介绍和示例代码。
Flutter常用的几种动画
|
XML 存储 Android开发
Flutter | 动画(上)
Flutter | 动画(上)
Flutter | 动画(上)
|
开发工具 UED 开发者
Flutter | 动画(下)
Flutter | 动画(下)
Flutter | 动画(下)
|
Java 程序员 Android开发
Flutter(十六)——Hero动画
Flutter(十六)——Hero动画
318 0
Flutter(十六)——Hero动画