解决方案非常简单。
所以几天前我回来看我的问题只是发现仍然没有新的解决方案,所以我尝试了 Bartek 解决方案并无法使其工作,即使它确实工作,干净的 Hilt 代码变得太乱了,所以我做了一点调查并玩了一点,发现解决方案实际上非常简单。
它是这样的:
应用程序:
@HiltAndroidApp
class MyApp: Application()
活动:(实现回调)
@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:(将活动提供/绑定到回调)
@Module
@InstallIn(ActivityComponent::class)
object SomeModule{
@Provides
fun provideCallback(activity: Activity) =
activity as SomeClass.Callback
}
这就是我们所需要的。我们无法使用 @Bind 将活动绑定到回调,因为它需要显式提供并强制转换为回调,以便应用程序可以构建。
该模块安装在 ActivityComponent 中并且知道一个通用的“活动”,如果我们将它转换为回调,Hilt 是内容并且活动绑定到回调,并且只要它在 Hilt 就会知道如何提供回调具体活动范围。
多个活动/片段
应用程序:
@HiltAndroidApp
class MyApp: Application()
图书活动:
@AndroidEntryPoint
class BooksActivity : AppCompatActivity(), BooksAdapter.Callback{
@Inject
lateinit var adapter: BooksAdapter
...
override fun onItemClicked(book: Book) {...}
}
}
作者活动:
@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
}
模块可以毫无问题地连接到一个模块,只需更改函数的名称。
这当然适用于更多活动和/或多个片段......适用于所有逻辑案例。