Fragments + ViewBinding 的最佳实践

shk*_*hko 1 android android-fragments kotlin

在 Google Codelab(不记得是哪一个)中,他们建议对片段执行以下操作:

class MyFragment : Fragment() {

    private var _binding: MyFragmentBinding? = null
    private val binding get() = _binding!!

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

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

}
Run Code Online (Sandbox Code Playgroud)

然后使用例如访问视图binding.button1

这样做有没有具体的原因,使用_bindingbinding?有更好的方法吗?也许是 Fragment 的扩展(例如 BaseFragment),以避免代码重复。

Moh*_*jeb 5

不建议使用 BaseFragment 或 BaseActivity 或 BaseViewModel...它只会向您的项目添加样板代码。

对于绑定,您可以像这样使用它:

宣言:

private var binding: MyFragmentBinding? = null
Run Code Online (Sandbox Code Playgroud)

在创建视图时:

binding = MyFragmentBinding.inflate(inflater, container, false)
binding?.root
Run Code Online (Sandbox Code Playgroud)

用法:

binding?.button...
binding?.text...
binding?.cardView...
Run Code Online (Sandbox Code Playgroud)

onDestroyView:

binding = null
Run Code Online (Sandbox Code Playgroud)

一切都会正常工作,但是我们经常使用空检查(?),这使得代码变得混乱,如果我们需要某个视图中的某些内容,我们需要进行大量空检查,所以我们确信在onCreateViewonDestroyView,绑定不为空,所以我们有_bindingbinding

private var _binding: MyFragmentBinding? = null
private val binding get() = _binding!!
Run Code Online (Sandbox Code Playgroud)

我们_binding用 var 使其可变,这样我们就可以给它一个值,并且我们使它可以为空,以便稍后可以清除它。我们有binding一个自定义的 getter,这意味着每次我们调用binding它都会返回最新的值_binding,并强制它不为空!!

现在我们分离变量,我们必须_binding初始化并清除我们的绑定,并且binding它是不可变的且不可为空,仅将其用于访问视图而无需进行空检查?