安卓MVI架构模式常见问题:View层接收不到新的StateFlow状态

news/2024/11/8 15:02:40/

1、检查ui层是否正确监听了Flow

如果监听操作封装在ui层的基类,如BaseActivity,的initView方法中,那么实现类在重新父类的initView方法时,必须调用super.initView()

2、检查Ui层当前的ViewModel和发送新ui状态的ViewModel是否是同一个

override val mViewModel: PushApkViewModel

get() = getKoin().get()

比如,如果ui层使用这种方式声明ViewModel,那么每次用到ViewModel时,都会从依赖注入框架中取,如果该ViewModel没有声明为单例,那么每次都是创建新的。ui层会监听最新创建的那个ViewModel,而不会监听正在更新ui数据的那个。

3、使用密封类对象作为StateFlow的值时,如需改变对象内容,更新到界面,必须创建新的密封类对象,再update()到界面

如果StateFlow的值是密封类,并且内部嵌套其他密封类,那么,两个密封类对象都需要重新创建,不可复用。

(案例:StateFlow中存放页面State,页面State中存放下载状态State,此时如更新下载进度,如只修改下载进度,复用下载状态State,会导致StateFlow认为对象没有发生变化,从而不通知到订阅者)

4、View层的生命周期问题

repeatOnLifecycle(Lifecycle.State.RESUMED) { }

lifecycleScope.launchWhenResumed { }

如果使用这种写法,在它们的代码块中去监听Flow,那么当然,在View层stop时就无法收到新的状态事件。


http://www.ppmy.cn/news/142394.html

相关文章

uni-app使用echarts绘制数据可视化图

先打开项目 然后选择 使用命令行窗口打开所在目录(U) 在弹出的终端中输入指令来引入依赖 npm install echarts然后 我们 打开echarts的官网 点击这里这个 示例 找一个自己喜欢的案例点进去 我这里就用一个最简单的吧 代码看着不会乱 将他这个 option中的内容复制出来 然后…

Qt 帮助项目

Qt帮助项目收集生成压缩帮助文件所需的所有数据。除了诸如目录,索引关键字和帮助文档之类的实际帮助数据外,它还包含一些其他信息,例如用于标识帮助文件的名称空间。一个帮助项目代表一个文档集。 Qt帮助项目文件格式 文件格式是基于XML的。…

Error running Android Debugger (8600): Unable to open debugger port (localhost:8600): java.net.Conne

adb kill-server adb start-server 在AS底部找到Terminal 命令输入框,依次输入上面两个命令

z370完美黑苹果_完工!搞掂i5-8600K 华硕PRIME Z370-P GTX 1060黑苹果安装

鲁大师配置图CPU:i5-8600K,主板:华硕PRIME Z370-P,内存:16GB,主硬盘:三星SSD 750EVO 250GB,显卡:GTX 1060 6GB技嘉,声卡:ALC887,网卡:…

惠普HP Officejet Pro 8600 Plus-N911g 打印机驱动

惠普HP Officejet Pro 8600 Plus-N911g 打印机驱动是官方提供的一款打印机驱动,本站收集提供高速下载,用于解决打印机与电脑连接不了,无法正常使用的问题,本动适用于:Windows XP / Windows 7 / Windows 8 / Windows 10…

解决安卓debug的时候Error running Android Debugger (8600)...Connection refused: connect

异常: Error running Android Debugger (8600): Unable to open debugger port (localhost:8600): java.net.ConnectException "Connection refused: connect" 解决方法: adb kill-serveradb start-server

兄弟Brother MFC-L8600CDW 驱动

兄弟Brother MFC-L8600CDW 驱动是官方提供的一款一体机(打印、扫描)驱动,本站收集提供高速下载,用于解决一体机与电脑连接不了,无法正常使用的问题,本动适用于:Windows XP / Windows 7 / Windows 8 / Windows 10 32/64…

解决 Can't bind to local 8600 for debugger 解决方案

1 把端口改成8601 (不想干掉占用8600端口的进程,如果8600端口是被你开启的其他进程占用, 如AndroidStudio,Consul等) 打开eclipse Window -> Preferences -> Android -> DDMS: Set Base local debugger port to "8601"…