如何在 Android 应用中使用 Dagger 库?
当我们创建一个新的 Android 项目时,最终我们开始积累不同的依赖以获得某些功能,但随着时间的推移,管理它们变得很麻烦,因此像 Dagger 这样的注入框架就派上用场了。然而,设置像 Dagger 这样的注入服务需要大量的样板代码,并且学习曲线非常陡峭。最初在没有 Android 支持的情况下添加 Dagger 的原始依赖项/版本是一场噩梦。
但是……然后是 Dagger-Android,它改变了这个游戏并满足了原始 Dagger 所缺乏的一切,比如减少了预制(样板)代码,但它仍然没有成功。在本文中,我们将通过构建一个简单的项目来理解以下内容。
- 什么是匕首图书馆,
- 依赖注入的类型,以及
- 如何在 Android 中使用构造函数依赖注入?
我们将构建一个非常简单的应用程序,我们将在其中显示文本。但是我们将通过使用构造函数依赖注入来做到这一点。
分步实施
第 1 步:创建一个新项目
要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。请注意,选择Java作为编程语言。
第二步:添加依赖
复制以下 Dagger 依赖项并将它们粘贴到您的应用程序级 build.gradle 文件中。
implementation ‘com.google.dagger:dagger:2.38.1’
annotationProcessor ‘com.google.dagger:dagger-compiler:2.38.1’
继续使用最新的 Dagger 版本,您可以从这里获取。
步骤 3:使用 activity_main.xml 文件
导航到app > res > layout > activity_main.xml并将以下代码添加到该文件中。下面是activity_main.xml文件的代码。在activity_main.xml文件中添加一个Simple TextView。
XML
Java
import java.io.*;
class Engine {
// Constructor
public void Engine() {
}
}
Java
import java.io.*;
class Wheel {
// Constructor
public void Wheel() {
}
}
Java
import java.io.*;
class Car {
Engine engine;
Wheel wheel;
// Constructor
public void Car(Engine engine , Wheel wheel) {
this.engine = engine;
this.wheel = wheel
}
// method
public String drive(){
return "Driving...";
}
}
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
// Declaring
TextView text;
Wheel wheel;
Engine engine;
Car car;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Defining
text = findViewById(R.id.textView);
wheel = new Wheel();
engine = new Engine();
car = new Car(engine, wheel);
// Use the drive method from the car object
String message = car.drive();
text.setText(message);
}
}
Java
import java.io.*;
@Component
interface CarComponent {
Car getCar();
}
Java
import java.io.*;
class Car {
Engine engine;
Wheel wheel;
// Constructor
@Inject
public void Car(Engine engine , Wheel wheel) {
this.engine = engine;
this.wheel = wheel
}
// method
public String drive(){
return "Driving...";
}
}
Java
import java.io.*;
class Wheel {
// Constructor
@Inject
public void Wheel(){
}
}
Java
import java.io.*;
class Engine {
// Constructor
@Inject
public void Engine() {
}
}
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
// Declaration
TextView text;
Car car;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Defining
text = findViewById(R.id.textView);
CarComponent carComponent = DaggerCarComponent.create();
car=carComponent.getCar();
String message = car.driving();
text.setText(message);
}
}
第 4 步:创建两个新的Java类
使用如下所示的空构造函数制作 2 个类Engine和Wheel
Java
import java.io.*;
class Engine {
// Constructor
public void Engine() {
}
}
Java
import java.io.*;
class Wheel {
// Constructor
public void Wheel() {
}
}
第 5 步:创建另一个Java类
- 创建一个 Car 类,其构造函数将采用 2 个对象(Engine 和 Wheel)作为参数。
- 创建一个函数drive(),它将返回一个字符串。在 drive()函数返回一个简单的字符串“Driving...”。
Java
import java.io.*;
class Car {
Engine engine;
Wheel wheel;
// Constructor
public void Car(Engine engine , Wheel wheel) {
this.engine = engine;
this.wheel = wheel
}
// method
public String drive(){
return "Driving...";
}
}
第 6 步:与 主要活动。 Java文件
现在在 MainActivity 中,
- 声明 TextView 并定义它
- 创建 Wheel 和 Engine 类的新对象
- 现在使用车轮和引擎对象创建汽车对象
- 只需使用我们在 Car 类中创建的驱动函数来获取字符串
转到主活动。 Java文件,参考如下代码。下面是MainActivity的代码。 Java文件。代码中添加了注释以更详细地理解代码。
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
// Declaring
TextView text;
Wheel wheel;
Engine engine;
Car car;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Defining
text = findViewById(R.id.textView);
wheel = new Wheel();
engine = new Engine();
car = new Car(engine, wheel);
// Use the drive method from the car object
String message = car.drive();
text.setText(message);
}
}
什么是依赖?
这里的依赖并不意味着 Gradle 依赖。没有引擎和车轮对象就不能创建汽车对象,所以汽车依赖于引擎和车轮,因此车轮和引擎是汽车的依赖关系。
为什么是匕首?
为了创建一个构造函数有参数的汽车对象,我们必须传递这些参数(引擎和车轮)。在创建汽车对象时。为此,我们必须创建 Wheel 和 Engine 的对象,这会创建凌乱的样板/可重用代码,这是一个非常乏味的过程。为了避免这些,我们可以使用 Dagger 依赖注入。
第 7 步:制作 CarComponent 接口
创建一个 CarComponent 接口并为其添加 @Component Annotation。 @Component 注解只是告诉编译器这个接口将成为汽车对象的组件。
Java
import java.io.*;
@Component
interface CarComponent {
Car getCar();
}
第八步:添加@Inject注解
为所有类(Car、Engine、Wheel)的构造函数添加@Inject 注释。
Java
import java.io.*;
class Car {
Engine engine;
Wheel wheel;
// Constructor
@Inject
public void Car(Engine engine , Wheel wheel) {
this.engine = engine;
this.wheel = wheel
}
// method
public String drive(){
return "Driving...";
}
}
Java
import java.io.*;
class Wheel {
// Constructor
@Inject
public void Wheel(){
}
}
Java
import java.io.*;
class Engine {
// Constructor
@Inject
public void Engine() {
}
}
步骤 9:重建项目
不要忘记在第 8 步之后重建项目
第10步:再次来到MainActivity,因为我们已经使用了Dagger依赖注入(只是添加了注解)。所有样板乏味的代码都消失了。 Dagger 本身会创建一个 CarComponent 类,因此我们不必创建 Wheel 和 Engine 对象。通过这种方式,Dagger 依赖注入使我们的工作更轻松,删除了样板代码。
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
// Declaration
TextView text;
Car car;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Defining
text = findViewById(R.id.textView);
CarComponent carComponent = DaggerCarComponent.create();
car=carComponent.getCar();
String message = car.driving();
text.setText(message);
}
}
输出: