Egret社区
产品 Egret Engine 版本 5.2.14
复现概率 100% 平台 Windows 10
复现步骤 new eui.Theme(null);按文档上说的是传入null可以在后面使用mapSkin手动映射,但是实际上却是会报错
文档描述:
/**
* 创建一个主题实例
* @param configURL 要加载并解析的外部主题配置文件路径。若传入 null,将不进行配置文件加载,
* 之后需要在外部以代码方式手动调用 mapSkin() 方法完成每条默认皮肤名的注册。
* @param stage 当前舞台引用。
* 若传入null,需要在外部手动调用 egret.registerImplementation("eui.Theme",theme) 来完成主题的注册。
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language zh_CN
*/
问题描述 new eui.Theme(null);按文档上说的是传入null可以在后面使用mapSkin手动映射,但是实际上却是会报错
文档描述:
/**
* 创建一个主题实例
* @param configURL 要加载并解析的外部主题配置文件路径。若传入 null,将不进行配置文件加载,
* 之后需要在外部以代码方式手动调用 mapSkin() 方法完成每条默认皮肤名的注册。
* @param stage 当前舞台引用。
* 若传入null,需要在外部手动调用 egret.registerImplementation("eui.Theme",theme) 来完成主题的注册。
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language zh_CN
*/
错误代码 new eui.Theme(null);按文档上说的是传入null可以在后面使用mapSkin手动映射,但是实际上却是会报错
文档描述:
/**
* 创建一个主题实例
* @param configURL 要加载并解析的外部主题配置文件路径。若传入 null,将不进行配置文件加载,
* 之后需要在外部以代码方式手动调用 mapSkin() 方法完成每条默认皮肤名的注册。
* @param stage 当前舞台引用。
* 若传入null,需要在外部手动调用 egret.registerImplementation("eui.Theme",theme) 来完成主题的注册。
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language zh_CN
*/
BUG截图

分享到 :
0 人收藏

2 个回复

倒序浏览
山猫  官方团队 | 2019-3-1 14:03:07
你好,我试了一下,没有错,就是第一个参数变成null,其他的什么也没变
var theme = new eui.Theme(null, this.stage);
egret.registerImplementation("eui.IAssetAdapter", assetAdapter);
egret.registerImplementation("eui.IThemeAdapter", new ThemeAdapter());
xigalto  登堂入室 | 2019-3-1 15:56:24
无语不能截图,贴你们的代码吧
        function Theme(configURL, stage) {
            var _this = _super.call(this) || this;
            .......
            _this.$configURL = configURL;
--------------------------------这里最好直接判断下configURL,然后再做后续调用

            _this.load(configURL);
            return _this;
        }
        /**
         * @private
         *
         * @param url
         */
        Theme.prototype.load = function (url) {
            var _this = this;
            eui.getTheme(url, function (data) { return _this.onConfigLoaded(data); });
        };
        /**
         * @private
         *
         * @param str
         */
        Theme.prototype.onConfigLoaded = function (str) {
            var data;
            if (typeof str == "string") {
                try {
                    data = JSON.parse(str);
                }
                catch (e) {
                    egret.$error(3000);
                }
            }
            else {
                data = str;
            }
            if (data && data.skins) {
                var skinMap = this.skinMap;
                var skins = data.skins;
                var keys = Object.keys(skins);
                var length_27 = keys.length;
                for (var i = 0; i < length_27; i++) {
                    var key = keys[i];
                    if (!skinMap[key]) {
                        this.mapSkin(key, skins[key]);
                    }
                }
            }
------------------------------------重点在这里---------------------------------------

            if (data.styles) {// data如果为null,这里会直接抛出异常,让整个Theme构造失败,根本不能进行后继操作
                this.$styles = data.styles;
            }


看你们eui中的源码,如果传递null,在load前并没有判定是否为null而是直接调用了,eui.getTheme返回的如果是个null,则会抛出异常,恰好我重写的这个会返回null,所以这里最好在构造的时候就直接跳过configURL为null的情况。
另外仅仅通过mapSkin添加映射并不能解决代码到皮肤的自动匹配,仍然得在IThemeAdapter的实现类里自己处理thm.json。(比如实际文件是网络文件,这里还得处理掉exmls里的内容才能正常匹配)

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部