我可以消除Android片段中的viewmodel和viewbinding样板代码吗?

问题描述 投票:0回答:1

我发现自己为创建的每个新片段编写样板代码。这包括设置视图模型和视图绑定,这是我的代码中两个彼此不依赖的不同部分,因此对其中一个的解决方案仍然很棒。

片段代码示例:

class MyFragment : Fragment() {

    // View binding
    private var _binding: FragmentMyBinding? = null

    // View model
    private lateinit var model : MyViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Model init
        model = ViewModelProvider(this).get(MyViewModel::class.java)

        //binding init
        _binding = FragmentMyBinding.inflate(inflater, container, false)

        return _binding!!.root
    }

}

class MyViewModel : ViewModel()
android kotlin android-viewmodel boilerplate android-viewbinding
1个回答
0
投票

如在ViewModel documentation page上所见,Kotlin代码不应使用ViewModelProvider(this),而应使用by viewModels(),它是by viewModels()依赖项的一部分。这代替了fragment-ktx的用法,并且必须在lateinit var model中做任何事情,这意味着,您的片段变成了:

onCreateView()

您可以遵循class MyFragment : Fragment() { // View binding private var _binding: FragmentMyBinding? = null // View model private val model: MyViewModel by viewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { //binding init _binding = FragmentMyBinding.inflate(inflater, container, false) return _binding!!.root } } 之类的方法,完全避免保留绑定。这种方法意味着您的片段将是:

this one

另一种选择是将class MyFragment : Fragment(R.layout.my_fragment) { // View model private val model: MyViewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val binding = FragmentMyBinding.bind(view) // Now use the binding and your ViewModel } } 复制到您的项目中并使用它,而使它看起来像:]]

AutoClearedValue

此时,无论使用哪种解决方案,您最多使用3条共享代码,所有这些代码行都是不同的,因此,尝试构建基本片段并处理泛型将使事情变得更加复杂,并且我不建议的内容。

© www.soinside.com 2019 - 2024. All rights reserved.