setFragmentResultListenerを使った通知をするDialogFragmentの実装提案

`androidx.fragment:fragment:1.3.0-alpha04`から新しく `setFragmentResult / setFragmentResultListener`が追加され、`setTargetFragment`がdeprecatedになりました。

おそらく多くの呼び出し元に通知を送る`DialogFragment`では、`setTargetFragment`を使ってListenerなどで実装していたのではないでしょうか。

```従来のDialogFragment.kt
class MyDialogFragment : DialogFragment() {

    companion object {
        private const val REQUEST_CODE = 100

        fun show(target: Fragment) =
            newInstance().run {
                setTargetFragment(target, REQUEST_CODE)
                show(target.requireFragmentManager(), "MyDialogFragment")
            }

        private fun newInstance() = MyDialogFragment()
    }

    private lateinit var listener: MyListener

    override fun onAttach(context: Context?) {
        super.onAttach(context)
        listener = targetFragment as? MyListener
            ?: throw IllegalArgumentException("This targetFragment is not `MyListener`")
    }
・・・
・・・
・・・
    interface MyListener {
        fun onClickHoge()
        fun onDismiss()
    }
}
```
だいたいこんな感じかと思うんですが、
もちろん`setTargetFragment`も`requireFragmentManager`も使えないので、
以下のような感じにすると、これまでの使用感をあまり変えずに、実装できるのではないでしょうか。

```提案するDialogFragment.kt
class MyDialogFragment : DialogFragment() {

    companion object {
        private const val REQUEST_KEY = "request_key_my_dialog"
        private const val RESULT_KEY_HOGE = "result_key_hoge_my_dialog"
        private const val RESULT_KEY_DISMISS = "result_key_dismiss_my_dialog"

        fun show(
            target: Fragment,
            onClickHoge: (() -> Unit)? = null,
            onDismiss: (() -> Unit)? = null
        ) {
            newInstance().run {
                target
                    .childFragmentManager
                    .setFragmentResultListener(REQUEST_KEY, target.viewLifecycleOwner) { requestKey, bundle ->
                        if (requestKey != REQUEST_KEY) return@setFragmentResultListener
                        when {
                            bundle.containsKey(RESULT_KEY_HOGE) -> onClickHoge?.invoke()
                            bundle.containsKey(RESULT_KEY_DISMISS) -> onDismiss?.invoke()
                        }
                    }
                show(target.childFragmentManager, "MyDialogFragment")
            }
        }

        private fun newInstance() = MyDialogFragment()
    }
```

まず、`setFragmentResultListener`にすることで、カスタムリスナーは必要なくなり、
`onAttach`での処理も全て必要なくなります。

ちなみに結果を通知する際は、例に倣って以下のように行います

```kotlin
// 通知したい場所で
setFragmentResult(REQUEST_KEY, bundleOf(RESULT_KEY_DISMISS to ""))
```

従来のDialogFragmentを使用する場合は、

```kotlin
// Fragmentで呼ぶ場合を想定
MyDialog.show(this)
```

こんな感じでshowして、通知に関しては、Fragmentにリスナーを実装していたと思いますが、

```kotlin
MyDialog.show(
    target = this,
    onClickHoge = {
        // Hogeの処理
    },
    onDismiss = {
        // Dismissの処理
    }
)
```

といった感じで、ラムダを使用して、カスタムリスナーを使用しなくても、
通知を実装することができ、とてもシンプルになります。


いかがでしょうか？
何かもう少しこうしたら良いなど、ご意見あればお願いいたします。

参考：
[setFragmentResultを使ったFragment間のデータ受け渡し](https://medium.com/@star_zero/setfragmentresult%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Ffragment%E9%96%93%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%97%E3%81%91%E6%B8%A1%E3%81%97-9223ddc1ca38)
[フラグメント間でデータを渡す](https://developer.android.com/training/basics/fragments/pass-data-between)