Dagger2之Kotlin写法

(Android) 在Kotlin项目中使用Dagger2 前言:本文不会介绍Dagger2如何使用,假设大家已经能够在java项目中使用dagger2今天在kotlin项目中配置了一下dagger2,发现和java中略有不同,写篇文章记录一下。项目配置首先,我们需要在gradle file里面配置kapt。如果在java中使用过dagger,肯定知道apt,apt是一个gradle插件,协助Android Studio 处理annotation proc... 阅读详情

依赖

项目的gradle

buildscript {
ext.dagger_version = '2.11'
}

module的gradle

//多模块项目,这个必须在使用到dagger2的所有moudle里都配置
apply plugin: 'kotlin-kapt'

dependencies {
    //dagger2,这个可以写在BaseMoudle里
    api "com.google.dagger:dagger:$dagger_version"
    //多模块项目,这个必须在使用到dagger2的所有moudle里都配置
    kapt "com.google.dagger:dagger-compiler:$dagger_version"
}

概念

@Inject

  1. 修饰构造方法
  2. 修饰变量,在宿主类里,引入要注入的实例

@Module

生产实例的工厂,每一个实例都是通过@Provides修饰的方法提供的

专门解决,不是自己写的类无法在其构造函数上加@Inject的情况

当然自己写的类也可以通过@Provides修饰的方法提供,这样就不会找@Inject的构造函数了

Component

Component是桥梁纽带,是一个接口

功能1:组织依赖关系(链条)

一个Component可以组织多个Module
一个Component还可以组织引入其他的Component

依赖的查找顺序为:先找@Module,如果找到了就停止,如果找不到就去找@Inject

功能2:为宿主类提供Inject方法

@Inject+@Component

所有实例类型全部在我掌控之中
最简单的情况 (不需要Module)

(要注入的实例的类都是自己写的,不需要Module,自己写的类自己用@inject修饰构造方法)

构造方法不带参数

  1. 注入类的构造方法使用 @Inject
class Apple @Inject constructor(){
    var color:String ="red"
}
  1. 必须有一个FruitComponent接口,提供一个注入方法

    注意:参数必须为要使用对象注入的类

@Component
interface FruitComponent {
    fun inject(activity: MainActivity)
}
  1. 通过inject注入所有对象,@Inject使用注入对象
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var apple: Apple//注入实例

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        DaggerFruitComponent.builder().build().inject(this)//必须注入一下
        tv1.setOnClickListener {
            rx1()
        }
    }

    private fun rx1() {
        toast(apple.color)

    }
}

构造方法带参数

(但是所带参数的构造函数,也可以被@Inject修饰,即所带参数的类型的类也是自己写的)

class Apple @Inject constructor(val knife: Knife) {
    var color: String = "red"
}
class Knife @Inject constructor() {
    var name: String = "小刀"
}
@Component
interface FruitComponent {
    fun inject(activity: MainActivity)
}
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var apple: Apple
    @Inject
    lateinit var knife: Knife
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        DaggerFruitComponent.builder().build().inject(this)
        tv1.setOnClickListener {
            rx1()
        }
    }

    private fun rx1() {
        Log.e("CCC",knife.name)
        Log.e("CCC",apple.color)

    }
}

@Inject+@Component+@Module(含@Provides)

有些实例类型,我无法掌控

别慌!@Module来帮忙

两种情况

  1. 你要注入的实例的类型就不是你自己写的类,无法使用@inject
  2. 你要注入的实例的类型就是你自己写的类,但是带了一个参数,这个参数类型的类不是你自己写的,无法使用@inject

情况一

@Module
class SecondModule {
    @Provides
    fun provideString():String{
        return  "我是String,你能在我的构造方法上加@inject吗?是的,你不能!"
    }
}
@Component(modules = [SecondModule::class])
interface SecondComponent {
    fun  inject(activity:MainActivity)
}
class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var s: String


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        DaggerSecondComponent.builder().build().inject(this)//注入
        tv1.setOnClickListener {
            rx1()
        }
    }

    private fun rx1() {
        Log.e("CCC", s)
    }
}

情况二

Person 是我自己写的类,我可以在它构造方法上面加@inject,但是他有一个参数是String,你要提供Person对象就必须提供Person所需要的所有参数,我们无法在String上加@inject

class Person @Inject constructor(var name: String){
    
}
@Module
class SecondModule {
    @Provides
    fun provideString():String{
        return  "我是为Person提供name的,但是我是String,你能在我的构造方法上加@inject吗?是的,你不能!"
    }
}
@Component(modules = [SecondModule::class])
interface SecondComponent {
    fun  inject(activity:MainActivity)
}
class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var person: Person

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        DaggerSecondComponent.builder().build().inject(this)
        tv1.setOnClickListener {
            rx1()
        }
    }

    private fun rx1() {
        Log.e("CCC", person.name)
    }
}
为什么你的Dagger2注解不生效?详解Gradle中annotationProcessor的正确打开方式 本文详细解析了Dagger2注解在Gradle中不生效的原因及解决方案,重点介绍了annotationProcessor的正确配置方式。通过对比implementation与annotationProcessor的区别,帮助开发者避免常见配置错误,确保依赖注入在编译时正确处理。适用于Android开发中遇到注解失效问题的开发者。 阅读详情

相关推荐

kotlin的dagger hilt依赖注入

dagger hilt帮助我们以简单的方式注入了依赖,省去了构造函数注入的操作(如大量的声明传参的依赖),因此我们能更为集中地管理依赖。更为重要的一点是,我们可以更便捷的控制依赖的寿命。以单例为例,在一个完整的项目中,例如数据库的单例只能存在一个,但是我们不会只有一个单例;同时我们可以确定特定依赖项的范围,比如限定某个依赖只能依附于某个activity,这样当activity被销毁时,该依赖的内存也会被清理,进而用于其他地方。

qq_44016573的博客 1957

【Kotlin中使用Dagger2】基础入门篇(一)

Dagger2作为依赖注入神器相信很多朋友都听说过它的大名。只不过它的有些概念理解起来并不是那么清晰并且在使用的过程中也比较迷糊。我将把自身对Dagger2的理解、使用经验分享给大家希望对大家有所帮助。我将分几节详细介绍Dagger2在Kotlin在如何使用因为在Java中使用方式大同小异所以大家理解了Dagger2无论在Java还是Kotlin都能运用自如。 本节内容 这一小节我们先简单介绍一下Dagger2的基本使用主要包括 Dagger2环境配置 依赖注入DI @Inject @Compo

u010194271的博客 1424

kotlin使用Dagger2的过程全纪录

前言 Dagger2作为依赖注入神器,相信很多朋友都听说过它的大名。只不过它的有些概念,理解起来并不是那么清晰,并且在使用的过程中,也比较迷糊。 Dagger2有Google接手开发的一个基于JSR-330标准的依赖注入框架,它会在编译期间自动生成相关代码,负责依赖对象的创建,达到解耦目的。 下面将详细介绍关于kotlin使用Dagger2的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 kotlin中配置Dagger2 在app模块的build.gradle文件中进行如下配置,关于kapt的相关知识。 apply plugin: 'com.android.app

kotlin使用dagger2踩坑

kotlin中使用dagger2无法自动生成代码,编译报错

weixin_43837293的博客 416

Kotlin中使用Dagger2可能遇到的坑解决

在Android上创建去耦以及容易测试代码的几乎每位迟早都要诉诸Dagger,在Kotlin中设置Dagger有一些不同,所以下面这篇文章主要给大家介绍了关于Kotlin中使用Dagger2可能遇到的坑的解决方法,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。

node-red 可视化探索

配置socket选择配置流程产生url。

weixin_44133581的博客 3412

Kotlin学习笔记——Dagger2

Kotlin学习笔记——Dagger2

子曰 1004

LangChain入门(二)-通过 Google 搜索并返回答案

并复制他给我们生成 api key。(博主使用了GitHub账号登录)-邮箱验证-手机号验证-订阅-api-key。Serpapi 提供了 google 搜索的 api 接口。首先需要我们到 Serpapi 官网上注册一个用户,

Good Luck 1万+

常用的面试题目,Dagger2之Kotlin写法(1),一个Android应届生从上海离职

【Android 详细知识点思维脑图(技能树)】我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

wfegre的博客 674

晟矽微MC32F7361定时器的使用案例说明

110所以TIMER0所用的频率是FCPU的1/64,也就是8/64MHZ. 为1/8MHZ。//io口下拉电阻 1:enable 0:disablea。//io口上拉电阻 1:enable 0:disable。//io口下拉电阻 1:enable 0:disable。//io口上拉电阻 1:enable 0:disable。//io口下拉电阻 1:enable 0:disable。//io口上拉电阻 1:enable 0:disable。

liyanfei123456的博客 1129

草莓成熟度与叶片病虫害智能检测数据集应用全解析

本文深入解析草莓成熟度与叶片病虫害智能检测数据集的应用价值,涵盖从绿草莓到红果转色的完整成熟周期及白粉病、炭疽病等7种病害的精准识别。通过实战案例展示如何提升病害识别率至94%,并介绍数据集的科研价值,包括跨品种迁移学习和多模态数据融合技术。

weixin_28366353的博客 274

Kotlin MVP with Dagger2: 深入实战教程

Kotlin MVP with Dagger2: 深入实战教程 本教程将引导您了解并使用一个开源项目——Kotlin MVP Dagger2,它演示了如何在Android应用程序中运用Kotlin编程语言结合Model-View-Presenter(MVP)设计模式、Dagger2依赖注入框架以及Retrofit网络请求库。这个综合性的示例展示了如何构建结构清晰、易于测试的现代Android应用。...

gitblog_00468的博客 700

FC游戏金手指代码大全:亲测可用指南与内存修改原理

在计算机和游戏开发领域,内存修改是一项基础而强大的技术,它通过直接读写程序运行时内存中的数据,改变软件的行为和状态。其核心原理在于理解进程的内存地址空间布局,定位存储关键游戏变量(如生命值、金币数)的特定地址,并注入或锁定目标数值。这项技术的工程价值在于,它不仅能用于游戏辅助,更是软件逆向工程、漏洞分析和调试的重要实践手段。在怀旧游戏和模拟器场景中,内存修改以“金手指”或“作弊码”的形式广泛应用,帮助玩家自定义游戏体验。本文将聚焦FC(红白机)游戏,深入解析Game Genie码和Raw码两种主流金手指格式

weixin_30780649的博客 776

Dagger2 在 Kotlin 中的使用

Dagger2 在 Kotlin 中的使用 Dagger2 的基础知识和概念并不会在此文中过多描述,可以查阅 https://www.jianshu.com/p/c985e3f262f2 依赖 版本比较旧,可自行更新到最新版本 implementation 'com.google.dagger:dagger:2.21' implementation 'com.google.dagger:dagger-android-support:2.21' kapt 'com.google.dag

郑凯希的博客 860

Rockchip平台Android相机HAL3开发实战:从配置到调试全流程解析

本文深入解析了Rockchip平台Android相机HAL3的开发全流程。从理解AAL与PSL核心架构、解析关键配置文件(如camera3_profiles.xml和Tuning文件),到搭建编译环境、进行增量部署,并提供了系统日志分析、V4L2调试等高级问题排查技巧,为开发者提供了一套从配置到调试的实战指南。

docker7nomad的博客 843

第三节: 串口通信(用CubeMX学习STM32)

用CubeMX学习STM32, 串口通信学习, 通过轮询方式和中断方式两种方式进行通信演示。 STM32F407zgt6

Kevin_8_Lee的博客 8904

MVP + Dagger2 + Kotlin 随笔

这些工具的使用入门门槛还是挺高的,属于架构设计层次。所以边学习边记录一些学习过程的知识。其中涉及大量转载知识点。 MVP+Dagger2 + + KotlinMVPDagger2引入插件和依赖Dagger2注解的一些规约Dagger2结构简单描述插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出

lilie008的专栏 369

Graybox Overview

Graybox功能使能够在sub_module上执行扫描和ATPG操作,然后能够在更高层次的层次上执行扫描和ATPG操作时使用该子模块的简化的Graybox表示,从而简化了分层设计中的扫描插入和ATPG操作过程。由于子模块的graybox表示只包含极少量的互连电路(子模块与top的互连),在大型分层设计中使用graybox可以极大地减少执行扫描插入,优化计时,分析故障和创建测试pattern所需的memory和工具runtime。

weixin_44954910的博客 1079

如何用Dagger 2在Kotlin Android应用中实现依赖注入:基于PhotoAffix的完整教程

PhotoAffix 是一款用 Kotlin 编写的 Android 照片拼接应用,它将 Dagger 2 依赖注入框架运用得恰到好处:通过 1 个 AppComponent 和 5 个 Module,把图片引擎、用户偏好、协程调度器等依赖自动装配到界面层。这篇完整教程带你从核心概念到实战源码,快速掌握 Dagger 2 依赖注入的全部用法。 [![PhotoAffix Android 照片拼接

gitblog_00726的博客 971

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Kotlin MVP Dagger2 项目教程

Kotlin MVP Dagger2 项目教程 1. 项目的目录结构及介绍 kotlin-mvp-dagger2/ ├── app/ │ ├── build.gradle │ ├── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ ├── com/ │ │ │ │ │ ├── ogulcan/ │...

gitblog_00265的博客 772

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

android-kotlin-mvp-architecture核心组件解析:Dagger2依赖注入实战

android-kotlin-mvp-architecture是一个基于Kotlin实现的MVP架构示例项目,它巧妙融合了Dagger2依赖注入框架,为Android应用开发提供了清晰的组件解耦方案。本文将深入剖析该项目中Dagger2的核心实现,帮助开发者掌握依赖注入在MVP架构中的实战应用。 ## 🌟 Dagger2在MVP架构中的核心价值 在Android开发中,依赖注入是降低组件耦合

gitblog_00216的博客 968

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

在kotlin的安卓项目中使用dagger

在kotlin的安卓项目中使用dagger

https://github.com/Mac-Zhu 935

dagger kotlin_Android教程第2部分:将Room与RxJava 2,Dagger 2,Kotlin和MVVM结合使用

dagger kotlinThis is the second part of the tutorial: Using Room with RxJava 2, Dagger 2, Kotlin and MVVM. 这是本教程的第二部分:将Room与RxJava 2,Dagger 2,Kotlin和MVVM一起使用。 In Part 1 we set up Gradle dependencies,...

weixin_26739079的博客 339

Kotlin中使用Dagger的坑:@Inject报错

最近开发App,由于学了些kotlin,感觉挺实用,比java要简洁,就用到项目中了 当用到dagger是,使用kotlin写的类,@Inject注入的时候报错了 注入失败了,然后我看了一下java的注入写法,以及@Scope都一样,java就没有问题 然后觉得应该是kotlin注入需要特殊处理,之后就发现了这篇文章https://blog.csdn.net/qq_26585943...

sese12138的博客 2384
上一篇: Gradle 自定义插件
下一篇: @Singleton能保证单例吗
Android_Study_OK
博客等级 码龄11年 91粉丝 128原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值