首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Android】只给个泛型,如何自动初始化ViewModel与ViewBinding?这几种方案值得了解

,能不能直接在基类中: ViewModelProvider(this).get(VM::class.java) VB.inflate(inflater) 这样会报错的,因为运行期间泛型会被擦除也无法实例化对应的对象...其实我们想要在基类完成泛型的实例化,我们目前是有两种思路,一种是反射获取到泛型的实例,一种是通过编译器代码生成完成对象的实例创建,其中又分为APT代码生成和ASM字节码插桩两个小分支。...,第二个泛型为ViewBinding,那么我们就能找到当前类的泛型对象的class,更进一步我们甚至能通过反射调用它的方法得到 VB 的实例对象。...混淆,这才是大问题,反射代码在混淆过程中我们需要额外的注意,因为类和成员的名称可能会被改变。如果不正确配置混淆规则,可能导致在运行时无法正确地通过名称找到相应的类、方法或字段,引发异常。...我们注释掉混淆规则 # 保持ViewModel和ViewBinding不混淆,否则无法反射自动创建 -keep class * implements androidx.viewbinding.ViewBinding

36310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    详解C# 利用反射根据类名创建类的实例对象

    EXE 或 DLL) dynamic obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例 2、若要反射当前项目中的类(即当前项目已经引用它了...(即包括命名空间)"); // 创建类的实例,返回为 object 类型,需要强制类型转换 3、也可以为: Type type = Type.GetType("类的完全限定名"); dynamic...======================================================= 补充: 1)反射创建某个类的实例时,必须保证使用类的完全限定名(命名空间 + 类名)。...若实现“跨程序集”,请使用第一种方法创建类的实例,并反射该实例的字段、属性、方法、事件... 然后动态调用之。...最后对比下: 元数据形成:根据代码具体shu容形成类的记录信息; 反射:根据元数据的记录找到所需的代码; 至于实例,用Type类实现很方便: Type t = typeof(System.string)

    3.1K10

    Android基于DataBinding+Koin实现MVVM模式页面快速开发框架

    中是没办法进行处理的,因为 ViewModel 中没办法拿到 Context 实例,比如 toast 提示、弹框、页面跳转等,这些情况怎么处理呢?...• 基础支撑:封装工具类、扩展和事件的 Model 及接口。...创建对应布局的 Binding 类,也就是传入的泛型的实例 • 通过 setContentView 将实例化的 Binding 对象的 root View 设置给当前 Activity • 调用子类实现的...方法并实现了如下功能: • 调用 createViewModel方法创建 ViewModel 实例对象 • 调用 Binding 的 setVariable方法绑定 ViewModel 对象 BaseBindingViewModelActivity...同样的先看一个简单的时序图: 时序图解析: • 事件通过 Activity 传到到 View • Binding 里监听到事件后将事件传递到 ViewModel • ViewModel 中调用父类 BaseViewModel

    1.5K20

    架构组件之 ViewModel | 中文教学视频

    与此同时,也让您在开发过程中更好地遵循单一职责的设计原则。此外,ViewModel 的另一大特点是它不会因为配置变更而销毁。...架构组件之 ViewModel | 中文教学视频 在视频的代码示例中,我们使用了 Kotlin 来创建 ViewModel, 创建 ViewModel 方法如下: 在 build.gradle 文件里加入生命周期管理库...(Lifecycle); 继承 ViewModel 类; 使用 ViewModelProviders 来关联 ViewModel 和相对应的UI组件 接着把曾经保存在 UI 界面中的数据剥离出来...另,生命周期管理库 LiveData 和 Room 视频即将上线,敬请期待 更多详细内容介绍,请访问以下文档链接 架构组件的官方开发者文档 ViewModel 的文档 应用程序架构指南 使用生命周期管理库的架构组件实例...-Java 使用生命周期管理库的架构组件实例 - Kotlin 架构组件实例 ViewModelFactory 实例 Android 生命周期备忘录 视频播放列表地址 腾讯视频链接 优酷链接 YouTube

    1.5K30

    Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)

    的创建方式 创建 ViewModel 实例的方式主要有 3 种,它们最终都是通过第 1 种 ViewModelProvider 完成的: 方法 1: ViewModelProvider 是创建 ViewModel...ViewModel 实现原理分析 2.1 ViewModel 的创建过程 上一节提到,3 种创建 ViewModel 实例的方法最终都是通过 ViewModelProvider 完成的。...; 参数 2 Factory: 它对应于 ViewModel 的创建工厂,缺省时将使用默认的 NewInstanceFactory 工厂来反射创建 ViewModel 实例。...创建 ViewModelProvider 工具类后,你将通过 get() 方法来创建 ViewModel 的实例。...get() 方法内部首先会通过 ViewModel 的全限定类名从映射表(ViewModelStore)中取缓存,未命中才会通过 ViewModel 工厂创建实例再缓存到映射表中。

    1.2K20

    掌握 Jetpack Compose 中的 State,看这篇就够了

    不要在 State 实例之外操作状态的值, Compose 会无法感知到对象内容变化,因此也无法更新自动更新 UI 。...记住这一点(双关):在 Compose 里,我们无法控制我们的 Compose 代码会被多频繁调用,也控制不了它执行的次数。注意,上面这些讨论只有在 Compose 函数中创建状态的时候成立。...如果状态是通过ViewModel创建的,那就不需要使用remember {}对状态进行一层封装。...使用mutableStateOf()在ViewModel中创建表示状态的MutableState实例,在ViewModel内更新 UI 状态,UI 界面能通过这个暴露出来的状态进行 UI 刷新。...要做到这点,需要引入相关的拓展方法。这些拓展方法会帮我们把响应式的实例转换成 Jetpack Compose 中的状态实例。如何在 Jetpack Compose 中使用 Kotlin 的 Flow?

    8.5K111

    【Jetpack】Room + ViewModel + LiveData 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

    ( 导入依赖 | 定义 Entity 实体类 | 定义 Dao 数据库访问对象接口 | 定义数据库实例类 ) 中 , 实现了 使用 Room 框架访问 Android 中的 SQLite 数据库的操作...使用 @Database 注解修饰该类 , 其中定义 获取 Dao 数据库访问对象的抽象方法 , 以及 将该抽象类设置成 单例类 , 在单例对象初始化时创建数据库 ; 在 Room 框架中的 Dao...Dao 又是通过 Database 得到的 , 因此在 该 Repository 中需要先获取 Database 数据库实例类对象 , 然后通过 Database 获取 Dao 数据访问接口 ;...* 设置该数据类对应数据库中的一张数据表, 表名为 student * 该数据库表中的数据对应一个 Student 类实例对象 */ @Entity(tableName = "student")...获取 Dao 数据库访问对象的抽象方法 , 以及 将该抽象类设置成 单例类 , 在单例对象初始化时创建数据库 ; 完整代码 : package kim.hsl.rvl import android.content.Context

    1K20

    python 类的创建, 实例化, 初始化以及面向对象(4.1)

    类的创建, 实例化, 初始化 什么是类 类就是拥有相同功能或者相同属性的对象集合 类的创建 object是所有类的基类 class GoGamer(object): subject = 'go'...print(GoGamer) 类的实例化 实例就是抽象概念的具象化 kejie = GoGamer() print(kejie) 类的初始化 类创建一个新实例的时候会默认调用__init__这样一个特殊方法...init__(self, obj): self.p = obj kejie = GoGamer("金勺子") print(f"柯洁含着{kejie.p}出生") 关于self 指代还未实例化的实例...__class__.mro() return mro[mro.index(cls) + 1] def super(类, 实例): # 获取当前实例的方法解析顺序 mro = 实例....类.mro() return mro[mro.index(类) + 1] 多态 方式为覆盖和重载 覆盖(子类和父类之间的, 是垂直的关系) 子类可以继承父类的所有属性和方法, 但是同时子类也可以重写父类的属性和方法

    1.2K10

    Kotlin 和 JetPack 的项目实战(一)

    搭建基于 MVVM 的项目框架 --- 前言 从谷歌在 2017 年的 Google IO 宣布 Kotlin 成为 Android 开发的官方语言开始,已经过去将近 2 年了,Kotlin 越来越被开发者所关注...这意味着我 们需要向函数传递⼀个 T 类型的实例,并且我们可以在函数内部调⽤该实例的成员。...基础类 我希望在 BaseFragment 中实现一些基础的监听者模式,基本只用到 ViewModel 和 LiveData 2个库来完成 那先从 ViewModel 说起 abstract class...() , 而他的父类 LiveData 的 setValue() 是个 protected 方法 ,可以对外隐藏赋值操作,一定程度上让数据操作完全局限在 ViewModel 中。...创建并且保管的,传参数需要通过实现 ViewModelProvider.Factory 接口来完成,例如以下这个类: class DownloadFactory( val novelId

    1K10

    【C++】构造函数分类 ② ( 在不同的内存中创建类的实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 )

    一、在不同的内存中创建类的实例对象 1、栈内存中创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) 中 , 介绍了 三种类型的 构造函数 , 并在 main 函数中 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 类实例对象 , 最终将实例对象赋值给了...栈内存中的 变量 Student s1 ; 这些都是在 栈内存 中创建 类的实例对象 的情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值...; 栈内存中 调用 构造函数 创建的 实例对象 , 不需要关注其内存占用 ; 2、堆内存中创建实例对象 在 栈内存 中声明 类 的 实例对象 方式是 : 该 s1 实例对象存放在栈内存中 , 会占用很大块的栈内存空间...语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类的 实例对象 ; 在下面的 C++ 代码中 , 声明并定义了 MyClass 类 , 该类定义了一个有参构造函数 , 接受两个整数作为

    18820

    再谈协程之viewmodel-livedata难兄难弟

    其实不能叫扯上关系吧,ViewModel和LiveData属于「架构组件」,而协程是「异步工具类」,ViewModel和LiveData搭上了协程这条快车道,让Google推了几年的AAC架构更加快的让人接受了...但这样创建的ViewModel有个小问题,我们可以看下它的源码,在ViewModelProvider中,它默认的NewInstanceFactory是使用反射来创建VIewModel的无参构造函数的,如下所示...,返回ViewModel的实例。...ViewModel的实例来使用,参考系统ComponentActivity的viewModels拓展,创建一个自定义的viewModel拓展函数,将自定义Factory实现的代码传递进来即可。...除此之外,为了利用协程的结构化并发,ViewModel提供了viewModelScope来作为默认的可控生命周期的协程作用域,所以,我们通常会抽象出一个ViewModel基类,封装viewModelScope

    1.1K40
    领券