简单聊聊Android和Flutter的ViewModel实现方案

一.LiveData

public class DemoData extends LiveData<DemoData> {
    private int tag1;
    private int tag2;
    
    public int getTag1() {
        return tag1;

    }
    public void setTag1(int tag1) {
        this.tag1 = tag1;
        postValue(this);
    }

    public int getTag2() {
        return tag2;
    }

    public void setTag2(int tag2) {
        this.tag2 = tag2;
        postValue(this);
    }
}
   mDemoViewModel.getDemoData().observe(this, new Observer<DemoData>() { //注册观察者,观察数据的变化
            @Override
            public void onChanged(DemoData demoData) {
                Log.e(TAG, "onChanged: 数据有更新");
            }
        });

二.MutableLiveData

  1. ViewModel可以感知生命周期,当Activity销毁不至于出现问题
  2.Fragment和Activity共享数据
  3.ViewModel常常搭配LiveData使用

public class DemoViewModel extends ViewModel {
    // TODO: Implement the ViewModel
    private MutableLiveData<String> myString = new MutableLiveData<>();

    public MutableLiveData<String> getMyString(){
        return myString;
    }

    public void setMyString(String string) {
        this.myString.setValue(string);
    }
}
 mDemoViewModel = ViewModelProvider(this).get(DemoViewModel::class.java)   
 mDemoViewModel.getMyString().observe(this, new Observer<String>() { //注册观察者
            @Override
            public void onChanged(String s) {
                Log.e(TAG, "onChanged: 值有变化="+s);
            }
        });

三.Flutter

  Flutte订阅者可以是Provider ,其内部主要根据InheritedWidget将依赖关联的Widget再同步更新

class MainViewModel extends ChangeNotifier 

四. 自定义

interface DataModelObserver {
    fun onCountUpdate(newCount: Int)
}

/**
 * A singleton/observable data model for the data shared between Flutter and the host platform.
 *
 * This is the definitive source of truth for all data.
 */
class DataModel {
    companion object {
        val instance = DataModel()
    }

    private val observers = mutableListOf<WeakReference<DataModelObserver>>()

    public var counter = 0
        set(value) {
            field = value
            for (observer in observers) {
                observer.get()?.onCountUpdate(value)
            }
        }

    fun addObserver(observer: DataModelObserver) {
        observers.add(WeakReference(observer))
    }

    fun removeObserver(observer: DataModelObserver) {
        val iterator = observers.iterator();
        while (iterator.hasNext()){
            val next = iterator.next();
            if (next.get() == null || next.get() == observer) {
                observers.remove(next)
            }
        }
    }
}

五.总结

1.由此看来,MVVM中的ViewModel层关键在于创建一个可观察对象,我想这应该也算响应式编程,

2.Flutter UI层面则是彻底的响应式,其展示依赖数据和框架层处理

3.Android UI结合LiveData,则也可以监听数据变化从而数据UI,也就是随着数据的变化UI发生变化

六.参考

Android开发 LiveData与MutableLiveData详解

Android开发 ViewModel_1_了解与简单使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值