简单聊聊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
    评论
可以使用Flutter的camera插件来实现Android Studio中调用手机模拟器摄像头实现拍照功能。以下是实现步骤: 1. 在pubspec.yaml文件中添加camera插件依赖: ``` dependencies: camera: ^0.9.4+5 ``` 2. 在Flutter项目中引入camera插件: ``` import 'package:camera/camera.dart'; ``` 3. 初始化摄像头: ``` List<CameraDescription> cameras; Future<void> initCamera() async { cameras = await availableCameras(); // 选择第一个摄像头 final firstCamera = cameras.first; final camera = CameraController( firstCamera, ResolutionPreset.medium, ); await camera.initialize(); setState(() { _camera = camera; }); } ``` 4. 在Flutter页面中显示摄像头预览: ``` @override void initState() { super.initState(); initCamera(); } @override void dispose() { _camera.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( body: _camera == null ? Container() : AspectRatio( aspectRatio: _camera.value.aspectRatio, child: CameraPreview(_camera), ), ); } ``` 5. 实现拍照功能: ``` void takePicture() async { final picturePath = join( (await getTemporaryDirectory()).path, '${DateTime.now()}.png', ); await _camera.takePicture(picturePath); } ``` 6. 在Flutter页面中添加一个按钮,调用takePicture()方法实现拍照: ``` FloatingActionButton( onPressed: takePicture, child: Icon(Icons.camera_alt), ), ``` 完成上述步骤后,您就可以在Android Studio中调用手机模拟器摄像头实现拍照功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值