📌  相关文章
📜  如何在 Android 应用中使用 Dagger 库?

📅  最后修改于: 2022-05-13 01:55:02.841000             🧑  作者: Mango

如何在 Android 应用中使用 Dagger 库?

当我们创建一个新的 Android 项目时,最终我们开始积累不同的依赖以获得某些功能,但随着时间的推移,管理它们变得很麻烦,因此像 Dagger 这样的注入框架就派上用场了。然而,设置像 Dagger 这样的注入服务需要大量的样板代码,并且学习曲线非常陡峭。最初在没有 Android 支持的情况下添加 Dagger 的原始依赖项/版本是一场噩梦。

但是……然后是 Dagger-Android,它改变了这个游戏并满足了原始 Dagger 所缺乏的一切,比如减少了预制(样板)代码,但它仍然没有成功。在本文中,我们将通过构建一个简单的项目来理解以下内容。

  • 什么是匕首图书馆,
  • 依赖注入的类型以及
  • 如何在 Android 中使用构造函数依赖注入

我们将构建一个非常简单的应用程序,我们将在其中显示文本。但是我们将通过使用构造函数依赖注入来做到这一点。

分步实施

第 1 步:创建一个新项目

要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。请注意,选择Java作为编程语言。



第二步:添加依赖

复制以下 Dagger 依赖项并将它们粘贴到您的应用程序级 build.gradle 文件中。

继续使用最新的 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 个类EngineWheel

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 中,

  1. 声明 TextView 并定义它
  2. 创建 Wheel 和 Engine 类的新对象
  3. 现在使用车轮和引擎对象创建汽车对象
  4. 只需使用我们在 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);
    }
}

输出: