weex 多页面之间数据共享有什么好的解决方案?

查看:245
本文介绍了weex 多页面之间数据共享有什么好的解决方案?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

多页面之间需要共享一些数据,例如:登陆后的用户信息

除了使用 storage 之外,还有其他解决方案吗?

解决方案

我们是重写了官方的storage模块,增加了数据写入修改删除的监听,实现所有页面的数据交互

新建StorageAdapter接口

package cn.com.lygtq.storage.adapter;

import com.taobao.weex.bridge.JSCallback;

public interface ILygTQStorageAdapter {
    void addListener(String key, JSCallback callback);
}

新建StorageAdapter

public class LygTQStorageAdapter implements IWXStorageAdapter, ILygTQStorageAdapter {

    // 以删除为例,其他可参看原始StorageAdapter实现
    @Override
    public void removeItem(final String key, final OnResultReceivedListener listener) {
        execute(new Runnable() {
            @Override
            public void run() {
                Map<String, Object> oldData = StorageResultHandler.getItemResult(performGetItem(key));

                Map<String, Object> data = StorageResultHandler.removeItemResult(performRemoveItem(key));
                if (listener == null) {
                    return;
                }
                listener.onReceived(data);
                fireListener(key, "delete", data, oldData);
            }
        });
    }
    
    private HashMap<String, List<JSCallback>> mListeners = new HashMap<>();
    private static String mListenerPrefix = "_lygtq_storage_listener_";

    @Override
    public void addListener(String key, @Nullable final JSCallback callback) {
        String listenerKey = mListenerPrefix + key;
        List<JSCallback> callbacks = mListeners.get(listenerKey);
        if (callbacks == null) {
            callbacks = new ArrayList<>();
            mListeners.put(listenerKey, callbacks);
        }
        callbacks.add(callback);
    }

    public void fireListener(String key, String type, Map<String, Object> data, Map<String, Object> oldData) {
        String listenerKey = mListenerPrefix + key;
        List<JSCallback> callbacks = mListeners.get(listenerKey);
        if (callbacks != null) {
            for (JSCallback callback : callbacks) {
                Map<String, Object> eventParams = new HashMap<String, Object>();
                eventParams.put("type", type);
                eventParams.put("data", data);
                eventParams.put("oldData", oldData);
                // callback.invokeAndKeepAlive(eventParams);
                callback.invoke(eventParams);
            }
        }
    }
}

新建StorageModule

public class LygTQStorageModule extends WXStorageModule {

    ILygTQStorageAdapter mLygTQStorageAdapter;

    private ILygTQStorageAdapter ability() {
        if (mLygTQStorageAdapter != null) {
            return mLygTQStorageAdapter;
        }
        mLygTQStorageAdapter = (ILygTQStorageAdapter) WXSDKEngine.getIWXStorageAdapter();
        return mLygTQStorageAdapter;
    }

    @JSMethod(uiThread = false)
    public void addListener(String key, @Nullable final JSCallback callback) {
        if (mLygTQStorageAdapter == null)
            mLygTQStorageAdapter = ability();
        mLygTQStorageAdapter.addListener(key, callback);
    }
}

然后注册adapter、module就可以使用了

这篇关于weex 多页面之间数据共享有什么好的解决方案?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆