gpt4 book ai didi

android - 如何使用 Hilt 绑定(bind)/提供 Activity 或 Fragment?

转载 作者:行者123 更新时间:2023-12-02 13:27:48 25 4
gpt4 key购买 nike

我正在尝试在 Android 应用程序上实现 Hilt,虽然与 Dagger 相比,它很容易实现并删除了很多样板代码,但我想念一些东西,比如构建我自己的组件并自己确定它们的范围,所以我会有我自己的雇佣关系。
直截了当:示例:假设我有一个简单的应用程序,其中包含一个 RecyclerView、Adapter、Acitivity 和一个嵌套在我的 Adapter 中的回调,我将其传递给我的 Adapter 构造函数以检测点击或其他什么,我让我的 Activity 实现那个回调,当然我想注入(inject)适配器。

class @Inject constructor (callBack: Callback): RecyclerView.Adapter...
当我让 Hilt 知道我想注入(inject)我的适配器时,我需要让 Hilt 知道如何提供所有适配器依赖项——回调。
在 Dagger 中,我可以通过将 Activity 绑定(bind)到我的一个模块中的回调来实现这一点:
@Binds fun bindCallback(activity: MyActivity): Adapter.Callback
Dagger 知道如何绑定(bind) Activity(或任何 Activity/Fragment),然后将其链接到该回调,但使用 Hilt 它不起作用。
我怎样才能做到这一点?如何使用 Hilt 提供或绑定(bind) Activity 或 Fragment?

最佳答案

解决方案非常简单。
所以几天前我回来看我的问题只是发现仍然没有新的解决方案,所以我尝试了 Bartek 解决方案并无法使其工作,即使它确实工作,干净的 Hilt 代码变得太乱了,所以我做了一点调查并玩了一点,发现解决方案实际上非常简单。
它是这样的:
应用程序:

@HiltAndroidApp
class MyApp: Application()
Activity :(实现回调)
@AndroidEntryPoint
class MainActivity : AppCompatActivity(), SomeClass.Callback {

@Inject
lateinit var someClass: SomeClass

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

override fun onWhatEver() {
// implement
}
}
SomeClass:(带有内部回调)
class SomeClass @Inject constructor(
private val callback: Callback
) {

fun activateCallback(){
callback.onWhatEver()
}

interface Callback{
fun onWhatEver()
}
}
SomeModule:(将 Activity 提供/绑定(bind)到回调)
@Module
@InstallIn(ActivityComponent::class)
object SomeModule{

@Provides
fun provideCallback(activity: Activity) =
activity as SomeClass.Callback

}
这就是我们所需要的。
我们无法使用 @Bind 将 Activity 绑定(bind)到回调,因为它需要显式提供并强制转换为回调,以便应用程序可以构建。
该模块安装在 ActivityComponent 中并且知道一个通​​用的“Activity ”,如果我们将它转​​换为回调,Hilt 是内容并且 Activity 绑定(bind)到回调,并且只要它在 Hilt 就会知道如何提供回调具体 Activity 范围。
多个 Activity/fragment
应用程序:
@HiltAndroidApp
class MyApp: Application()
图书 Activity :
@AndroidEntryPoint
class BooksActivity : AppCompatActivity(), BooksAdapter.Callback{

@Inject
lateinit var adapter: BooksAdapter

...

override fun onItemClicked(book: Book) {...}
}
}
作者 Activity :
@AndroidEntryPoint
class AuthorsActivity : AppCompatActivity(), AuthorsAdapter.Callback{

@Inject
lateinit var adapter: AuthorsAdapter

...

override fun onItemClicked(author: Author) {...}
}
图书适配器
class BooksAdapter @Inject constructor (
val callback: Callback
) ... {

...

interface Callback{
fun onItemClicked(book: Book)
}
}
作者适配器
class AuthorsAdapter @Inject constructor (
val callback: Callback
) ... {

...

interface Callback{
fun onItemClicked(auhtor: Auhtor)
}
}
作者模块
@Module
@InstallIn(ActivityComponent::class)
object AuthorsModule {
@Provides
fun provideCallback(activity: Activity) =
activity as AuthorsAdapter.Callback
}
书籍模块
@Module
@InstallIn(ActivityComponent::class)
object BooksModule {
@Provides
fun provideCallback(activity: Activity) =
activity as BooksAdapter.Callback
}
模块可以毫无问题地连接到一个模块,只需更改函数的名称。
这当然适用于更多 Activity 和/或多个 fragment ......适用于所有逻辑案例。

关于android - 如何使用 Hilt 绑定(bind)/提供 Activity 或 Fragment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63207731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com