【问题标题】:How to bind external library class with callback in Hilt?如何在 Hilt 中将外部库类与回调绑定?
【发布时间】:2021-07-05 14:16:50
【问题描述】:

我是 Hilt 的初学者。我有一个接受接口的库。该库执行一些操作并调用接口回调。我有一个通过传递接口实现来调用这个库的活动。我想知道如何使用 Hilt 进行注入。

库中的接口

 interface InterfaceInLibrary() {

   fun callback1()
   fun callback2(/*params */)

}

活动

class MyActivity: InterfaceInLibrary() {

  override fun onCreate(savedInstanceState: Bundle?) {
   
  //library initialization
  val myLibraryClass = MyLibraryClass.getInstance(this) //passing the InterfaceInLibrary implementation

  }

  override fun callback1() {
    Toast.makeText(this, "callback1", Toast.LENGTH_LONG).show()
  }
  
  override fun callback2() {
    Toast.makeText(this, "callback2", Toast.LENGTH_LONG).show()
  }

}

我想知道如何使用HiltMyLibraryClass 注入MyActivity

【问题讨论】:

    标签: android dagger dagger-hilt


    【解决方案1】:

    我知道的唯一可能的方法(或者至少我在我的项目中如何处理这个用例)是现场注入调用接口的具体类,然后让活动实现具体类并从回调继承.由于您的接口和具体类看起来有点奇怪,我将在这里提供一个完整的实现。假设我们有以下接口:

    界面

    interface IMyCallbackInterface {
        fun callbackWithoutParameters()
        fun callbackWithParameters(value: String)
    }
    

    然后,您需要一些类来调用此回调。就我而言,这始终是一个 recylerview.adapter,但我们将使用更简单的东西:

    调用类

    class MyInvokingClass @Inject constructor() {
         // this interface will be initialized by our activity
         private lateinit var callbackListener: IMyCallbackInterface
    
         // This function invokes the first callback
         fun someFunctionThatInvokesCallbackWithoutParameters() {
             // do some stuff
             callbackListener.callbackWithoutParameters()
         }
    
         // This function invokes the second callback
         fun someFunctionThatInvokesCallbackWithParameters() {
             // do some stuff
             callbackListener.callbackWithParameters(value = "Hello")
         }
         
         // This will be called from our activity to initialize the callback
         fun initializeCallback(callbackOwner: IMyCallbackInterface) {
             this.callbackListener = callbackOwner
         }
    }
    

    然后,您需要现场注入类并从活动中的回调继承

    活动或片段

    class MyActivity : IMyCallbackInterface {
    
         @Inject lateinit var invokingClass: MyInvokingClass
    
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate()
             setContentView(...)
             
             // Since MyActivity implements the interface
             // it is an instance of it. So you can simply
             // say, that the "owner" of the callback is the activity
             invokingClass.initializeCallback(this@MyActivity)
         }
    
          override fun callbackWithoutParameters() {
              // do some stuff
          }
    
          override fun callbackWithParameters(value: String) {
              // do some stuff with string
          }
    }
    

    因为我们的Activity继承自callback,我们在onCreate()中说过MyInvokingClass的interfaceOwner就是activity,所以每次调用callback时,也会调用activity内部的接口函数。

    【讨论】:

    • 我在哪里初始化库?在“MyInvokingClass”的“initializeCallback”方法中?
    • “初始化库”是什么意思?你通过@Inject 将你的库注入到你的活动中,你没有初始化任何东西
    • 就像我在问题中提到的那样,我有一个库,我正在尝试初始化并从中调用一个方法。我需要传递接口实例。 val myLibraryClass = MyLibraryClass.getInstance(this) 如何在 Activity 中注入“MyLibraryClass”?
    • “myLibraryClass”到底是什么。它是您自己创建的类还是您的应用程序范围之外的类(依赖项)?如果它是一个依赖项,那么您需要一个模块并通过@Provide 提供它。这在官方刀柄文档中有解释..
    • 'myLibraryClass' 是我的应用范围之外的一个类。我已将库导入到我的应用程序中。我需要将接口实现传递给库。库执行一些操作并调用传递的回调。我知道我必须在模块中使用提供来注入对象。在我的例子中,实现接口和库初始化的活动发生在 Activity 中。所以我想知道如何在模块类中“提供”相同的内容。
    猜你喜欢
    • 2021-12-23
    • 2022-11-16
    • 2020-01-26
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多