0

我发现了关于在android 文档上使用导航库返回数据

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val navController = findNavController();
// We use a String here, but any type that can be put in a Bundle is 
supported
navController.currentBackStackEntry?.savedStateHandle?.getLiveData<String> 
("key")?.observe(
    viewLifecycleOwner) { result ->
    // Do something with the result.
   }
}

navController.previousBackStackEntry?.savedStateHandle?.set("key", result)

但是,如果我使用全局操作执行以下操作,我无法使其工作:片段 x ->(全局操作)片段 A ->片段 B ->(popbackstack(A,true))->片段 X

这是有意的还是有其他方法可以解决这个问题?(我知道 viewModels,但只是想尝试新技术)

编辑:从文档添加代码

4

2 回答 2

0

我找到了解决方案:使用带有特定 fragmentId 的 getBackStackEntry 来保存结果

 findNavController().getBackStackEntry(R.id.fragmentId).savedStateHandle.set(
            KEY,
            "Value"
        )

在前面的片段中获得结果的方式相同。

findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<List<Uri>>(
        ImageViewerFragment.ADDED_IMAGE_KEY
    )?.observe(
        viewLifecycleOwner
    ) { result ->
      //do something
      }
于 2020-08-25T14:39:38.483 回答
0

开始Fragment 1.3.0-alpha04FragmentManager各具特色FragmentResultOwner。您可以使用Fragment Result API. 安卓文档

import androidx.fragment.app.setFragmentResultListener
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Use the Kotlin extension in the fragment-ktx artifact
    setFragmentResultListener("requestKey") { key, bundle ->
        // We use a String here, but any type that can be put in a Bundle is supported
        val result = bundle.getString("bundleKey")
        // Do something with the result...
    }
}

import androidx.fragment.app.setFragmentResult
button.setOnClickListener {
    val result = "result"
    // Use the Kotlin extension in the fragment-ktx artifact
    setFragmentResult("requestKey", bundleOf("bundleKey" to result))
}
于 2020-08-25T14:22:17.487 回答