支持 Java 和 Kotlin onSaveInstanceState 带来的挑战 ViewModel 一发布,执行 onSaveInstanceState 的相关的逻辑时要如何操作 ViewModel...对应 Activity 实例被永久关闭; Activity 配置 (configuration) 被改变: 例如,旋转屏幕等操作,会使 Activity 需要立即重建; 应用在后台时,其进程被系统杀死:...ViewModel 与 Jetpack 导航: 在 NavGraph 中使用 ViewModel 于 navigation 的 2.1.0-rc01 版本时加入 支持 Java 与 Kotlin 共享...想要创建嵌套导航图,您需要选中对应流程相关的界面,点击鼠标右键,并选择 Nested Graph → New Graph: △ 创建嵌套导航图的截图 注意嵌套导航图在 XML 文件中的 id,在这里是...版本时加入 支持 Java 与 Kotlin 移除 LiveData 相关的模板代码 ViewModel、LiveData 与 Data Binding 的集成方式并不是什么新功能,但它始终非常好用。
相对于传统Fragment事务,Navigation组件的优势在于: 导航图的可视化: 使用导航图直观展示应用中的导航流程,方便理解和修改。...类型安全: 利用Kotlin的类型安全特性,减少在导航时的错误。 生命周期感知: 自动处理Fragment的生命周期,避免了一些常见的生命周期相关问题。...出发点: 在解答这个问题时,不仅要强调ViewModel的用途,还要深入讨论其在Android架构中的角色和优势。...参考简答: ViewModel的作用在于解决Android应用中活动和碎片(Fragment)的生命周期问题。它允许数据在屏幕旋转等配置更改时存活,并确保数据在不同组件之间共享而不丢失。...数据共享:通过ViewModel,可以在不同的UI组件之间共享和管理数据,避免重复加载或丢失数据。 状态保存:ViewModel在配置变更时保持其状态,例如屏幕旋转,避免重新加载数据和执行耗时操作。
在 Kotlin 中使用 Android 的 Java API 时,您会迅速意识到这样的做法失去了 Kotlin 语言简单有趣的特点。...目前为止,已有超过 20 个库拥有对应的 KTX 版本,这些 KTX 库实现了常用的 Java 版本 API 的功能,包括 Android 平台 API、ViewModels、SQLite,甚至还有 Play...和 commit() 不同,apply() 函数会将数据修改异步写入磁盘。...core-ktx 创建了 TextWatcher 中对应的方法: doOnTextChanged、doAfterTextChanged 以及 doBeforeTextChanged,在 Kotlin 中...要实例化 ViewModel,可以使用 viewModels 委托 (详阅: Kotlin Vocabulary | Kotlin 委托代理): by ViewModels(factory): ViewMode
在 Kotlin 中使用 Android 的 Java API 时,您会迅速意识到这样的做法失去了 Kotlin 语言简单有趣的特点。...目前为止,已有超过 20 个库拥有对应的 KTX 版本,这些 KTX 库实现了常用的 Java 版本 API 的功能,包括 Android 平台 API、ViewModels、SQLite,甚至还有 Play..." 始终导入 -ktx 软件包 要使用 Android 平台 API 的 Kotlin 扩展,导入 core-ktx 软件包即可。...和 commit() 不同,apply() 函数会将数据修改异步写入磁盘。...要实例化 ViewModel,可以使用 viewModels 委托 (详阅: Kotlin Vocabulary | Kotlin 委托代理): by ViewModels(factory): /* Copyright
Model 这里的Model有所不同,里面还包含UI的状态。 View 还是视图,例如Activity、Fragment等。...* 创建Api网络请求服务 */ val apiService: ApiService = getRetrofit().create(ApiService::class.java...) } 由于担心你看的时候导错包,现在贴代码我会将导包的信息也贴出来,这样你总不会再导错包了吧。...三、意图与状态 之前我们说MVI的I 是Intent,表示意图或行为,和ViewModel一样,我们在使用Intent的时候,也是一个Intent对应一个Activity/Fragment。...① 列表适配器 在创建适配器之前首先我们需要创建一个适配器所对应的item布局,在layout下新建一个item_wallpaper_rv.xml,代码如下图所示: <?
; 参数 2 Factory: 它对应于 ViewModel 的创建工厂,缺省时将使用默认的 NewInstanceFactory 工厂来反射创建 ViewModel 实例。...关于 Kotlin 委托属性的更多内容,我们在 Kotlin | 委托机制 & 原理 & 应用[11] 这篇文章讨论过,这里不重复。...= null } 2.3 ViewModel 如何实现不同的作用域 ViewModel 内部会为不同的 ViewModel 宿主分配不同的 ViewModelStore 映射表,不同宿主是从不同的数据源来获取...这样就实现了不同的 Activity 或 Fragment 分别对应不同的 ViewModelStore 实例,进而区分不同作用域。...映射表中); LiveData: 保留旧的实例(因为 LiveData 是 ViewModel 的成员变量); 现在,我们逐一分析这 3 个阶段的源码执行过程: 阶段 1 源码分析: Activity.java
及以上版本,有很多不同之处。...:navigation-fragment:$nav_version" // use -ktx for Kotlin implementation "android.arch.navigation...:navigation-ui:$nav_version" // use -ktx for Kotlin } 创建导航图 导航是发生在应用的目标示图之间——用户可以导航到应用当中的任何的位置。...然后我们直接拖NavHostFragment 的视图到我们的activity文件当中 在导航视图当中添加目标视图 这里总共有三种不同的方式可以在我们的导航视图当中添加目标视图 添加已经存在的目标视图 如果我们想把已经存在的目标视图想要添加在导航图当中...如果我们没有使用app:popUpToInclusive =“true”那么也意味着我们的堆栈当中包含两个A的实例。
Koin 无反射、无代码生成且使用更简单;借助该库可轻松在基于 kotlin 的 Android 应用开发中实现依赖注入,降低代码的耦合性。...' id 'org.jetbrains.kotlin.android' // 添加 kotlin-kapt 插件 id 'kotlin-kapt' } 配置完成后,点击 Sync...中进行更新,常规事件也可以在 ViewModel 中进行处理,但是跟 Context 相关的处理在 ViewModel 中是没办法进行处理的,因为 ViewModel 中没办法拿到 Context 实例...下面将通过源码详细介绍对应功能的实现原理。...getMethod("inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java) // 反射获取
在程序运行过程中,我们可以通过 Kotlin 的安全调用操作符 (?.) 来根据当前的设备配置确定呈现给用户哪一个视图。...由于 Google I/O 应用使用了 Jetpack Navigation 实现不同界面之间的切换,这个挑战对导航图有怎样的影响,我们又该如何记录当前屏幕上的内容呢?...至于导航图,日程的目的地页面现在是双窗格 Fragment,而每个窗格中可以展示的目的地都已经被迁移到新的导航图中了。...不过,我们不能直接从会议列表导航到会议详情,因为两者如今已经被放到了不同的窗格中,也就是存在于不同的导航图里。...我们的替代方案是让会议列表和双窗格 Fragment 共享同一个 ViewModel,其中又包含了一个 Kotlin 数据流。
主 Activity 与导航图相关联,且包含一个负责根据需要交换目的地的 NavHostFragment。在具有多个 Activity 目的地的应用中,每个 Activity 均拥有其自己的导航图。...配置好每个Fragment,其中: app:startDestination 属性代表一开始显示的fragment android:name 属性代表对应的Fragment路径 action 代表该Fragment...分别对应数据库,表和数据访问。...的实例,然后进行数据监听等操作。...不同的 Fragment 可以使用其父Activity共享ViewModel 来进行数据的通信,厉害吧。还有很多其他的用法,去项目中慢慢发现吧!
) VB.inflate(inflater) 这样会报错的,因为运行期间泛型会被擦除也无法实例化对应的对象。...其实我们想要在基类完成泛型的实例化,我们目前是有两种思路,一种是反射获取到泛型的实例,一种是通过编译器代码生成完成对象的实例创建,其中又分为APT代码生成和ASM字节码插桩两个小分支。...class,更进一步我们甚至能通过反射调用它的方法得到 VB 的实例对象。...二、使用APT代码生成 其实相比ASM的字节码插桩,使用APT生成代码相对简单很多,我们可以生成对应的 ViewBinding 和 ViewModel 的初始化对象。...= "kapt.kotlin.generated" } } 那么我们只需要标记哪些类需要生成对应的文件即可,例如: @AutoInject class ProfileActivity : BaseActivity
类都将获得该类型的不同实例。...每一个 ViewModel 实例持有不同的 ViewModelComponent 实例,您可以使用 @ViewModelScoped 注解,将类型的作用域限定到该组件上。...ViewModel 可以在配置更改中保存状态,并且其生命周期可以被 Activity、Fragment,甚至是 导航图 控制。...如果需要将类型的作用域限定为 ViewModel,使其在配置更改时保留状态,或使其受导航图控制,使用 @ViewModelScoped 注解。...,RegistrationViewModel 和 LoginViewModel 将获得 不同的 UserInputAuthData 实例。
Android开发的重新定义,含糊不清的态度,既不丢弃Java又宣布kotlin 是首选语言。...其中ViewModel - LiveData 已经得到了广大开发者的认可,ViewModel 和LiveData 的结合,使得Android中数据可控性变得更好,耦合度更低,简单来说是官方将观察者模式用于到了真个数据结构中...,在这里也是将要结合其他框架来完成网络框架的设计 coroutines kotlin较Java的最大变化就是kotlin推出的coroutines (协程),协程完全可以替代RxJava, Thread...一般在使用ViewModel 的时候都是于一个或者一组逻辑相关的页面对应,将数据更加独立、清晰 class MainViewModel(private val mainRepository: MainRepository...基础、Java 基础、Android 源码相关分析、常见的一些原理性问题等等,可以很好地帮助我们深刻理解Android相关知识点的原理以及面试相关知识。
架构组件之 ViewModel | 中文教学视频 在视频的代码示例中,我们使用了 Kotlin 来创建 ViewModel, 创建 ViewModel 方法如下: 在 build.gradle 文件里加入生命周期管理库...(Lifecycle); 继承 ViewModel 类; 使用 ViewModelProviders 来关联 ViewModel 和相对应的UI组件 接着把曾经保存在 UI 界面中的数据剥离出来...,使用 ViewModel 来管理这些数据。...另,生命周期管理库 LiveData 和 Room 视频即将上线,敬请期待 更多详细内容介绍,请访问以下文档链接 架构组件的官方开发者文档 ViewModel 的文档 应用程序架构指南 使用生命周期管理库的架构组件实例...-Java 使用生命周期管理库的架构组件实例 - Kotlin 架构组件实例 ViewModelFactory 实例 Android 生命周期备忘录 视频播放列表地址 腾讯视频链接 优酷链接 YouTube
新建一个Android的项目起名为myviewmodel,然后在build.gradle中加入 apply plugin: 'kotlin-kapt' android { kotlinOptions...要使用DataBinding这个我觉得不用多主产了,直接开启这个就行,因为我用的是Kotlin所以上面还要加上kotlin-kapt 02 fragment-ktx的引用 ?...这样绑好了后,Android会通过apt的方式自动给我们生成了对应的Binding的Class,我们的xml名为activity_main所以生成的名称也是ActivityMainBinding。...ViewModel的实例 // viewModel = // ViewModelProvider( // this, //...//实例化ViewModel的实例 var viewModel = ViewModelProvider( this
前言 最近一直闭关修炼Kotlin,说实话真香真好用,刚好公司准备交给我一个新项目,于是打算直接用Kotlin来构建项目。刚好整体架构搭建完毕了,于是把网络请求这一部分先分享给大家。...只有各司其职才能把工作干好嘛,接下来咱们就围绕着各司其职来一个一个实现 协程实现 接下来把上面的请求换成协程的方式来实现 1.创建RetrofitClient object为了使RetrofitClient 只能有一个实例...MVVM,所以还用到了Android 新引入的组件架构之ViewModel和LiveData,先看ViewModel的实现 class ScrollingViewModel : ViewModel()...针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术...需要展开的架构学习笔记导图的加群免费获取 Android架构设计大群(185873940) ?
这些组件会自动集成到 Android 程序中的生命周期中。在使用的时候可以指定使用的范围,事情作用在对应的生命周期当中。...Hilt 有关如何提供不同类型的实例信息也称之为绑定 @Module module 是用来提供一些无法用 构造@Inject 的依赖,如第三方库,接口,build 模式的构造等。...Hilt 提供了以下组件来绑定依赖与对应 Android 类的活动范围 Hilt 组件 对应 Android 类活动的范围 ApplicationComponent Application ActivityRetainedComponent...Hilt 中组件的生命周期 Hilt 会根据相应的 Android 类生命周期自动创建和销毁组件的实例,对应关系如下: Hilt 提供的组件 创建对应的生命周期 结束对应的生命周期 作用范围 ApplicationComponent...@Module 模块用于向 Hilt 添加绑定,告诉 Hilt 如果提供不同类型的实例。
( 导入依赖 | 定义 Entity 实体类 | 定义 Dao 数据库访问对象接口 | 定义数据库实例类 ) 中 , 实现了 使用 Room 框架访问 Android 中的 SQLite 数据库的操作...插件 和 Kotlin 注解插件 ; plugins { id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' } 导入 Room 依赖库..., 注意这是 Kotlin 版本需要导入的依赖库 , 如果是 Java 版本 , 需要导入另外的注解处理器 ; // 导入 Room 依赖库 implementation 'androidx.room...{ id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' } android..., 表名为 student * 该数据库表中的数据对应一个 Student 类实例对象 */ @Entity(tableName = "student") class Student { /
提供一种简单的方法来为各种构建类型(如测试、调试或发布)配置不同的绑定。 但是Android中会实例化许多组件类,例如Activity,因此在应用中使用Dagger需要开发者编写大量的样板代码。...文件中添加以下依赖项: ... apply plugin: 'kotlin-kapt' apply plugin: 'dagger.hilt.android.plugin' android {...它会自动帮我们生成对应Android类的Componennt,并将其添加到Application类中。...对应的生命周期如下 ? 同时还提供了相应的作用域 ? 所以Hilt的默认提供将大幅提高开发效率,减少许多重复的定义 ViewModel 最后再来说下ViewModel的注入。...虽然自定义的ViewModelFactory是公用的,但是对于不同的ViewModel还是要手动定义不同的bindViewModel方法。
领取专属 10元无门槛券
手把手带您无忧上云