weex 多页面之间数据共享有什么好的解决方案?
本文介绍了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屋!
查看全文