当前位置: 首页 > news >正文

城市网站改版建设怎么开网店详细步骤教程

城市网站改版建设,怎么开网店详细步骤教程,吸引人的网站类型,上传资料网站什么是 Hilt#xff1f; Hilt 是一个功能强大、用法简单的依赖注入框架#xff0c;于 2020 年加入到 Jetpack 家族中。它是 Android 团队联系了 Dagger2 团队#xff0c;一起开发出来的一个专门面向 Android 的依赖注入框架。相比于 Dagger2#xff0c;Hilt 最明显的特征就…什么是 Hilt Hilt 是一个功能强大、用法简单的依赖注入框架于 2020 年加入到 Jetpack 家族中。它是 Android 团队联系了 Dagger2 团队一起开发出来的一个专门面向 Android 的依赖注入框架。相比于 Dagger2Hilt 最明显的特征就是简单并且提供了 Android 专属的 API。 在项目中引入 Hilt 此部分以使用了 Java 17 的 Jetpack Compose 新项目为例开发工具使用 Android Studio 2023.1.1 Canary 版本。信息截止 2023 年 5 月。 第一步打开 gradle/libs.versions.toml 文件加入 Hilt 的 Gradle 插件相关配置 [versions] hilt 2.46.1[plugins] hiltAndroid { id com.google.dagger.hilt.android, version.ref hilt }再打开项目的 build.gradle.kts 文件引入插件 plugins {alias(libs.plugins.hiltAndroid) apply false }第二步在 libs.versions.toml 中加入 Hilt 的插件和依赖库 [libraries] hilt-android { group com.google.dagger, name hilt-android, version.ref hilt } hilt-compiler { group com.google.dagger, name hilt-android-compiler, version.ref hilt }由于 Hilt 基于编译时注解实现需要添加 kotlin-kapt 插件。在 app 的 build.gradle.kts 文件中再加入如下配置 plugins {kotlin(kapt) }android {compileOptions {// 这里设置为 Java 8 或以上即可sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17} }dependencies {implementation(libs.hilt.android)kapt(libs.hilt.compiler) }现在Hilt 已被成功引入到项目中。 Hilt 的基本用法 准备工作 使用 Hilt 时必须自定义一个 Application 类否则 Hilt 将无法正常工作。自定义的 Application 类中可以不写任何代码但必须要加上 HiltAndroidApp 注解。 HiltAndroidApp class MyApplication : Application() { }接下来将 MyApplication 注册到 AndroidManifest.xml 中 applicationandroid:name.MainApplication /application准备工作到此已完成接下来的任务是根据具体的业务逻辑使用 Hilt 进行依赖注入。 入口点 Hilt 简化了 Dagger2 的操作使我们无需使用 Component 注解编写桥接层逻辑同时也限制了注入功能只能从几个 Android 固定的入口点开始Application、Activity、Fragment、View、Service、BroadcastReceiver。 其中只有 Application 入口点使用 HiltAndroidApp 注解声明其他所有入口点均使用 AndroidEntryPoint 注解声明。例如若希望在 Activity 中进行依赖注入只需这样声明 AndroidEntryPoint class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)} }不带参数的依赖注入 尝试定义一个类在其构造函数上声明 Inject 注解如下 class MusicPlayer() Inject constructor() {fun init() {Log.d(MusicPlayer, init)} }在 Activity 中注入即可成功调用上面编写的 init() 方法 AndroidEntryPoint class MainActivity : AppCompatActivity() {Injectlateinit var musicPlayer: MusicPlayeroverride fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)musicPlayer.init()} }带参数的依赖注入 在上面的 MusicPlayer 类构造函数中加入一个 AudioDriver 参数代表播放器组件依赖的系统音频驱动如下所示 class MusicPlayer() Inject constructor(val audioDriver: AudioDriver) {fun init() {Log.d(MusicPlayer, init, audioDriver$audioDriver)} }声明 AudioDriver 类时也为其构造函数加上 Inject 注解 class AudioDriver Inject constructor() {}不需要再修改任何代码即可成功调用 init() 方法并成功打印 audioDriver 的 hashCode。 接口的依赖注入 定义一个 IDecoder 接口代表播放音频时必备的音频解码器。接口中有两个待实现方法分别用于创建解码器和销毁解码器、释放内存 interface IDecoder {fun create()fun destroy() }实现用于解码 WAV 文件的 WavDecoder在构造函数中加上 Inject 注解 class WavDecoder Inject constructor() : IDecoder {override fun create() {Log.d(WavDecoder, create)}override fun destroy() {Log.d(WavDecoder, destroy)} }此外再实现用于解码 MP3 文件的 Mp3Decoder同样需要声明 Inject 注解 class Mp3Decoder Inject constructor() : IDecoder {override fun create() {Log.d(Mp3Decoder, create)}override fun destroy() {Log.d(Mp3Decoder, destroy)} }新建一个抽象类命名为 DecoderModule在这个模块中通过定义抽象函数提供 IDecoder 接口所需要的实例 Module InstallIn(ActivityComponent::class) abstract class DecoderModule {Bindsabstract fun bindDecoder(wavDecoder: WavDecoder): IDecoder }修改 MusicPlayer 类中的代码调用刚刚提供的解码器 class MusicPlayer() Inject constructor(val audioDriver: AudioDriver) {Injectlateinit var decoder: IDecoderfun init() {decoder.create()Log.d(MusicPlayer, init, audioDriver$audioDriver)decoder.destroy()} }此时再调用 init() 方法即可看到 TAG 为 WavDecoder 的日志。 给相同类型注入不同实例 Qualifer 接口用于给相同类型的类或接口注入不同的实例。分别定义两个注解如下 Qualifier Retention(AnnotationRetention.BINARY) annotation class BindWavDecoderQualifier Retention(AnnotationRetention.BINARY) annotation class BindMp3Decoder回到 DecoderModule 中定义两个抽象函数将刚才定义的两个注解分别添加到两个函数上方 Module InstallIn(ActivityComponent::class) abstract class DecoderModule {BindWavDecoderBindsabstract fun bindWavDecoder(wavDecoder: WavDecoder): IDecoderBindMp3DecoderBindsabstract fun bindMp3Decoder(mp3Decoder: WavDecoder): IDecoder }回到 MusicPlayer 类此时就可以让这个播放器同时支持两种格式的解码 class MusicPlayer() Inject constructor(val audioDriver: AudioDriver) {BindWavDecoderInjectlateinit var wavDecoder: IDecoderBindMp3DecoderInjectlateinit var mp3Decoder: IDecoderfun init() {wavDecoder.create()mp3Decoder.create()Log.d(MusicPlayer, init, audioDriver$audioDriver)wavDecoder.destroy()mp3Decoder.destroy()} }第三方类的依赖注入 假如我们想在 MainActivity 中注入 OkHttpClient该类由 OkHttp 提供我们无法为其构造函数加上 Inject 注解。这种情况下需要借助 Module 注解定义一个非抽象类此处命名为 NetworkModule。 在该类中定义一个方法加上 Provides 注解在函数体中提供一个 OkHttpClient 的实例如下 Module InstallIn(ActivityComponent::class) class NetworkModule {Providesfun provideOkHttpClient(): OkHttpClient {return OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS).build()} }回到 MainActivity使用 Inject 注入 OkHttpClient即可成功运行 AndroidEntryPoint class MainActivity : AppCompatActivity() {Injectlateinit var okHttpClient: OkHttpClient }为了方便开发者使用我们在 NetworkModule 再给 Retrofit 类型提供实例编写如下代码 Module InstallIn(ActivityComponent::class) class NetworkModule {Providesfun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {return Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(http://example.com/).client(okHttpClient).build()} }方法 provideRetrofit() 中的 okHttpClient 参数则会由 Hilt 自动使用 provideOkHttpClient() 方法进行创建。此时在 MainActivity 中再次尝试注入 Retrofit也可以正常运行 AndroidEntryPoint class MainActivity : AppCompatActivity() {Injectlateinit var retrofit: Retrofit }Hilt 内置组件 使用 Module 注入的类需要使用 InstallIn 注解指定注入的范围。Hilt 一共提供了 7 种组件类型分别用于注入到不同的场景 组件名注入范围ApplicationComponentApplicationActivityRetainedComponentViewModelActivityComponentActivityFragmentComponentFragmentViewComponentViewViewWithFragmentComponent使用 WithFragmentBindings 定义的 ViewServiceComponentService 若希望上方定义的 NetworkModule 可以在全项目中使用只需这样修改 Module InstallIn(ApplicationComponent::class) class NetworkModule { }Hilt 组件作用域 Hilt 默认会为每次的依赖注入行为都创建不同的实例。对应前面的 7 个内置组件Hilt 也提供了 7 种组件作用域注解如下所示 组件作用域对应内置组件SingletonApplicationComponentActivityRetainedScopeActivityRetainedComponentActivityScopedActivityComponentFragmentScopedFragmentComponentViewScopedViewComponentViewScopedViewWithFragmentComponentServiceScopedServiceComponent 若希望 NetworkModule 中提供的 Retrofit 和 OkHttpClient 实例在全局只创建一份只需加上 Singleton 注解 Module InstallIn(ActivityComponent::class) class NetworkModule {SingletonProvidesfun provideOkHttpClient(): OkHttpClient {return OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS).build()}SingletonProvidesfun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {return Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(http://example.com/).client(okHttpClient).build()} }作用域注解也可以被直接声明到任何可注入类的上方例如前面添加的 AudioDriver 类 Singleton class AudioDriver Inject constructor() { }这就表示 AudioDriver 在全局范围内都会共享同一个实例且全局都可以对 AudioDriver 类进行依赖注入。 如上图所示对某个类声明了某种作用域注解后该注解的箭头所能指到的地方都可以对该类进行依赖注入同时在该范围内共享同一个实例。 预置 Qualifier 若前面定义的 AudioDriver 类需要一个 Context 参数需要在该参数前加上一个 ApplicationContext 注解Hilt 会提供一个 Application 类型的 Context 给到 AudioDriver 类当中代码即可编译通过 Singleton class AudioDriver Inject constructor(ApplicationContext val context: Context) { }如果需要 Activity 或其他类型的 Context使用 Hilt 预置的另外一种 Qualifier 即可 Singleton class AudioDriver Inject constructor(ActivityContext val context: Context) { }此时编译代码会报错因为 AudioDriver 类是 Singleton 的与 Qualifier 的范围不匹配。 对于 Activity 和 Application 这两个类型Hilt 为它们预置好了注入功能。如果某个类依赖于 Activity 或 Application不需要添加任何注解Hilt 可以自动识别如下 class AudioDriver Inject constructor(val application: Application) { }class AudioDriver Inject constructor(val activity: Activity) { }注意必须是 Application 和 Activity 这两个类型即使声明它们的子类型编译都无法通过。 HiltViewModel 的使用 先在 libs.versions.toml 中声明相关依赖如下 [versions] hilt-lifecycle-viewmodel 1.0.0-alpha03[libraries] androidx-hilt-compiler { group androidx.hilt, name hilt-compiler, version.ref hilt-lifecycle-viewmodel }在 build.gradle.kts 中添加依赖 dependencies {kapt(libs.androidx.hilt.compiler) }通过 HiltViewModel 注解提供一个 ViewModel HiltViewModel class MainViewModel Inject constructor() : ViewModel() { }然后带有 AndroidEntryPoint 注解的 Activity 或 Fragment 即可使用 ViewModelProvider 或 by viewModels() 扩展照常获取 ViewModel 实例 class MainActivity : AppCompatActivity() {private val mainViewModel: MainViewModel by viewModels() }
http://www.hkea.cn/news/14493474/

相关文章:

  • 做漆包线的招聘网站wordpress swatch
  • 怎么做自己网站dw做的网站如何上传云服务
  • 陵川网站建设重庆峰宇园林建设有限公司网站
  • app制作工具无需编程网站优化seo四个建议
  • 陕西 网站建设 陕ICP网页设计素材模版
  • 个人网站备案号被注销怎样自己开网站赚钱
  • 外贸网站建设资料wordpress微信商城
  • 国家网站标题颜色搭配重庆市工程建设信息网官网新域名
  • 漳州网站建设求职简历网站模板的使用
  • 网站建设的人才怎么称呼自助建设响应式网站
  • 网站建设基本流程商城网站制作需要多少费用
  • 外国 网站模板凡科网做的网站在百度上能找到吗
  • 做go富集的网站时事新闻最新
  • 汕头做网站的公司十堰秦楚网新闻中心
  • 西部数码 网站建设wordpress 菜鸟
  • 做网站思想怎么建设网站网页游戏
  • 高端网站制造网站建设衤金手指花总
  • 建立网站费用多少郑州大型网站开发公司
  • 网站开发的税率是多少钱网络营销有哪些主要内容
  • 网站后台系统使用小程序模板与定制开发的区别
  • 佛山网站建设找方维网络郑州seo招聘
  • app公司网站模板如何用腾讯云建设自己网站
  • 怎样用c语言做网站简单几步为wordpress加上留言板
  • 网站建设维护公司资质黄埔做网站的公
  • dede做的网站总被挂马简易php企业网站源码
  • 国内网站设计经典案例泰安的网络建设公司
  • 制作小公司网站一般多少钱我的学校网页怎么制作
  • 网站使用问题哪些网站用c 做的
  • 佛山正规网站建设报价编程猫少儿编程官网
  • 渭南市住房和城乡建设局网站十堰网站建设电话