Skip to content

导航DialogFragment

Season edited this page Dec 8, 2023 · 1 revision

基本用法

在需要导航的DialogFragmentBottomSheetDialogFragment上添加@Destination注解,并设置对应的route路径,然后调用navigate方法并传入目的地的路径即可。

//定义目的地
@Destination(route = Destinations.DESTINATION_TEST)
class TestDialogFragment : DialogFragment()

@Destination(BOTTOM_SHEET_DIALOG_FRAGMENT)
class TestBottomSheetDialogFragment : BottomSheetDialogFragment() 

//导航
Butterfly.of(context).navigate(Destinations.DESTINATION_TEST)

route路径可以是任意字符串常量,通常我们使用scheme://path/xxx这样的格式作为route地址

DialogFragment参数传递和解析

Butterfly支持多种参数传递方式,可通过拼接路径的形式带入额外的参数,或者通过调用params方法手动传入参数, 或者在调用navigate方法时传入参数,或者混合使用以上几种方式。

//拼接路径带入参数
Butterfly.of(this).navigate(Destinations.DESTINATION_TEST + "?a=1&b=2&c=3")

//调用params方法
Butterfly.of(this)
    .params(
        "x" to 1,
        "y" to true,
        "z" to "test value"
    )
    .navigate(Destinations.DESTINATION_TEST)

//调用navigate时传入参数
Butterfly.of(this)
    .navigate(
        Destinations.DESTINATION_TEST,
        "a" to "1"
    )

//同时使用多种方式
Butterfly.of(this)
    .params(
        "x" to 1,
        "y" to true,
        "z" to "test value"
    )
    .navigate(
        Destinations.DESTINATION_TEST + "?a=1&b=2&c=3",
        "d" to "4"
    )

以上几种方式的优先级为:navigate > route string > params,也就是说如果遇到同名的参数, 则通过navigate方法传递的参数会覆盖拼接路径字符串中的参数,拼接路径字符串中的参数又会覆盖通过params方法传递的参数。

传入的参数会打包进一个Bundle对象,并设置为Fragment的Arguments,因此获取参数只需要对Fragment的Bundle对象进行解析即可。

@Destination(route = Destinations.DESTINATION_TEST)
class TestDialogFragment : DialogFragment() {
    val a by lazy { arguments?.getString("a") ?: "" }
    val b by lazy { arguments?.getString("b") ?: "" }
    val c by lazy { arguments?.getString("c") ?: "" }
    //...
}

除了手动解析参数以外,还可以使用Bracer库来进行智能参数解析

@Destination(route = Destinations.DESTINATION_TEST)
class TestDialogFragment : DialogFragment() {
    val a by params<String>()
    val b by params<String>()
    val c by params<String>()
}

Bracer 使用方式详情见: Github 地址 Bracer

DialogFragment回退及返回结果

使用Butterfly进行导航DialogFragment之后,如需返回可以使用popBack方法进行回退。

如果DialogFragment回退的时候需要携带返回值,使用popBack可以直接传入返回值。

@Destination(DIALOG_FRAGMENT)
class TestDialogFragment : DialogFragment() {

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

        binding.back.setOnClickListener {
            //使用popBack回退
            Butterfly.of(context).popBack()

            //使用popBack回退并返回值
            Butterfly.of(context).popBack("result" to "123")
        }
    }
}

返回结果会被封装为一个Bundle对象,通过解析Bundle即可获取返回结果:

Butterfly.of(context).navigate(Destinations.DESTINATION_TEST) { result ->
    if (result.isSuccess) {
        val bundle = result.getOrDefault(Bundle.EMPTY)
        val result by bundle.params<String>()
        println(result)
    }
}