【发布时间】:2021-10-30 19:52:24
【问题描述】:
更新
如果我从SearchFragment 中的mPresenter 中删除@Inject 注释并在运行时创建依赖项,例如在onCreateView() 中通过
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
mPresenter = SearchPresenter(this)
// ...
}
然后这个bug就神奇地消失了,所以它可能与Hilt有关。
原帖
我在我的应用程序中使用 Dagger-Hilt 2.38,其中有一个 `Activity` 和一个 `Fragment`,而后者又有一个 `EditText`。但是,在 `onTextChange()` 事件之后,我得到:kotlin.UninitializedPropertyAccessException:lateinit 属性 mBinding 尚未初始化 在 SearchFragment.onSearchResult(SearchFragment.kt:65) 在 SearchPresenter.search(SearchPresenter.kt:18) 在 SearchFragment$onCreateView$1.onTextChanged(SearchFragment.kt:36) 在...
非常感谢任何帮助!以下是我的设置:
主要活动
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var mSearchFragment: SearchFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager
.beginTransaction()
.replace(R.id.main_fragment_container, mSearchFragment)
.commit()
}
}
搜索模块
@Module
@InstallIn(ActivityComponent::class)
object SearchModule {
@Provides
fun provideView(): SearchContract.View {
return SearchFragment()
}
@Provides
fun providePresenter(view: SearchContract.View): SearchContract.Presenter {
return SearchPresenter(view)
}
}
搜索片段
class SearchFragment @Inject constructor() : Fragment(), SearchContract.View {
private lateinit var mBinding: FragmentSearchBinding
@Inject
lateinit var mPresenter: SearchContract.Presenter
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
mBinding = FragmentSearchBinding.inflate(inflater, container, false)
mBinding.edittextSearch.addTextChangedListener(object : TextWatcher {
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
mPresenter.search(p0.toString().trim())
}
override fun afterTextChanged(p0: Editable?) {}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
})
mBinding.recyclerview.apply {
adapter = SearchAdapter(mPresenter.getCompanies())
layoutManager = LinearLayoutManager(this@SearchFragment.activity)
}
return mBinding.root
}
override fun onSearchResult(symbols: List<Company>) {
(mBinding.recyclerview.adapter as SearchAdapter).updateSymbols(symbols)
(mBinding.recyclerview.adapter as SearchAdapter).notifyDataSetChanged()
}
}
SearchPresenter
@ActivityScope
class SearchPresenter @Inject constructor(private val mView: SearchContract.View) : SearchContract.Presenter {
override fun search(filter: String) {
mView.onSearchResult(listOf(Company(0, "APPL", "Apple Inc.")))
}
}
【问题讨论】:
标签: android kotlin dagger-hilt