首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Fragment.viewLifecycleOwnerLiveData.observe不使用kodein进行调用

Fragment.viewLifecycleOwnerLiveData.observe不使用kodein进行调用
EN

Stack Overflow用户
提问于 2021-02-12 00:04:39
回答 1查看 311关注 0票数 0

我正在做一个应用程序,我想把我的UI逻辑分成多个UI类,其中BaseUi类是生命周期感知的。我使用Kodein作为我的DI,当Kodein检索我的ui类的实例时,我遇到了fragment.viewLifecycleOwnerLiveData.observe未被调用的问题。下面是我的片段类:

代码语言:javascript
运行
复制
class ListFragment : Fragment(), DIAware {

    override val di: DI by closestDI()
    override val diTrigger: DITrigger = DITrigger()

    private var binding: FragmentMoviesBinding? = null

    private val fragmentBinding get() = binding

    private val kodeinMoviesUi: MoviesUi by instance() //fragment does not observe viewLifecycleOwnerLiveData

    private val moviesUi: MoviesUi = MoviesUi(this) //fragment now observe viewLifecycleOwnerLiveData

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentMoviesBinding.inflate(inflater, container, false)
        return binding?.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        diTrigger.trigger()
    }

    override fun onDestroyView() {
        super.onDestroyView()
        binding = null
    }
}

BaseUi类:

代码语言:javascript
运行
复制
abstract class BaseUi<F : Fragment>(private val fragment: F) : LifecycleObserver {

    init {
        fragment.viewLifecycleOwnerLiveData.observe(fragment, { subscribeToLifecycle() })
    }

    private fun subscribeToLifecycle() {
        fragment.viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
            fun onCreate() {
                onViewCreated()
            }
        })
    }

    abstract fun onViewCreated()
}

和UiModule:

代码语言:javascript
运行
复制
val uiModule = DI.Module("uiModule") {
    bind<ListFragment>() with provider { ListFragment() }
    bind<MoviesUi>() with provider { MoviesUi(instance()) }
}
EN

回答 1

Stack Overflow用户

发布于 2021-02-15 13:34:27

来自的交叉帖子

这就是你的问题bind<ListFragment>() with provider { ListFragment() }

您将ListFragment绑定到一个提供程序,这意味着每次您请求容器时,它都会创建一个ListFragment实例。因此,当您使用private val kodeinMoviesUi: MoviesUi by instance()注入MoviesUi时,它将获得ListFragment的另一个实例。

我建议您将MoviesUi的绑定定义为工厂,等待接收ListFragment实例:bind<MoviesUi>() with factory {fragment: ListFragment -> MoviesUi(fragment) },然后可以将其注入到ListFragment中,如:private val kodeinMoviesUi: MoviesUi by instance(args = this)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66158276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档