【问题标题】:Dagger Hilt - Fragment Binding getting Null?Dagger Hilt - Fragment Binding 为 Null?
【发布时间】: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


    【解决方案1】:

    我认为 onSearchResultonCreateView 之前被调用,因此您可以尝试在初始化中将 mBinding 设置为 null 并删除 lateint 以便之后您可以检查 (mBinidng != null) 是否按照您的意愿行事

    【讨论】:

    • 当然,应用程序现在不会崩溃,但我没有任何功能,因为mBinding == null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多