Android中的LiveData可以在activity可见时回调,那我们可以根据生命周期函数自己创建在页面可见时的回调
因为flutter没有resume,pause,要先看下如何添加这两个生命周期文章在这里,有了这两个生命函数才能实现LiveData
typedef CallBack =void Function(T data);
class LiveDataCallBack {
final boolstick;
intversion = -1;
final LifecycleStatestate;
final CallBackcallBack;
LiveDataCallBack(
{this.stick:true, this.state, @required this.callBack});
}
class LiveData {
T_data;
int_version = -1;
List>_listeners = [];
void removeListeners(LiveDataCallBack liveDataCallBack) {
_listeners.remove(liveDataCallBack);
}
void addListeners(LiveDataCallBack listener) {
if (listener ==null || listener.callBack ==null) {
return;
}
_listeners.add(listener);
if (!listener.stick) {
listener.version =_version;
}
if (listener.state ==null) {
_sendListener(listener);
return;
}
listener.state.addListener((event) {
if (event == Event.ON_DISPOSE) {
_listeners.remove(listener);
return;
}
if (event == Event.ON_PAUSE) {
return;
}
_sendListener(listener);
});
}
_sendListener(LiveDataCallBack listener) {
if (listener.version >=_version) {
return;
}
listener.version =_version;
listener.callBack(_data);
}
set data(T data) {
if (_data == data) {
return;
}
_data = data;
_version++;
_dispatchingValue();
}
void _dispatchingValue() {
_listeners.forEach((element) {
if (element.state ==null || element.state.isActive()) {
_sendListener(element);
}
});
}
}
LiveDataCallBack 第一个参数是否粘性数据,默认true,如何有数据在监听时立刻得到,第二个是我们添加生命周期,第三个是回调函数,如何生命周期函数不传在回调处使用setState在页面不处于显示时会报错,结构很简单