Как передать данные из одного Activity в другое, а затем получить их изменёнными обратно?

Нужно передать текст из MainActivity в EditPostActivity, где можно при желании отредактировать текст, затем вернуть этот отредактированный текст. Не могу придумать как передавать данные(post.content - одно из полей класса post) из viewModel.edited.observe(this).

Создаю контракт

 val editPostLauncher = registerForActivityResult(EditPostResultContract()) { result ->
            result ?: return@registerForActivityResult
            viewModel.changeContent(result)
            viewModel.save()
        }

Кнопка при которой должен измениться текст

viewModel.edited.observe(this) { post ->
            if (post.id == 0L) {
                return@observe
            }
            editPostLauncher.launch()
           }   
        }

Сам контракт

class EditPostResultContract(private val postContent: String) : ActivityResultContract<Unit, String?>() {

    override fun createIntent(context: Context, input: Unit): Intent =
        Intent(context, EditPostActivity()::class.java)

    override fun parseResult(resultCode: Int, intent: Intent?): String? =
        if (resultCode == Activity.RESULT_OK) {
            intent?.getStringExtra(Intent.EXTRA_TEXT)
        } else {
            null
          }
}

Активити где должен поменяться текст

class EditPostActivity() : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityEditPostBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.edit.requestFocus()
        binding.ok.setOnClickListener {
            val intent = Intent()
            if (binding.edit.text.isNullOrBlank()) {
                setResult(Activity.RESULT_CANCELED, intent)
            } else {
                val content = binding.edit.text.toString()
                intent.putExtra(Intent.EXTRA_TEXT, content)
                setResult(Activity.RESULT_OK, intent)
            }
            finish()
        }

    }
}

Ответы (1 шт):

Автор решения: Sky

Ваш контракт не принимает никаких входных параметров, ну почти. В текущей реализации вы прокидываете лишь параметр в конструктор и никак его в дальнейшем не используете.

Как выйти из этого положения? Модифицировать контракт следующим образом:

class EditPostResultContract() : ActivityResultContract<String, String?>() { // Допускаем, что входным значением будет тип `String`
    override fun createIntent(
        context: Context,
        input: String
    ) = Intent(context, EditPostActivity::class.java).apply {
        putExtra(LauncherActivity.SOME_KEY, input) // Пихаем значение 
    }

    override fun parseResult(resultCode: Int, intent: Intent?): String? {
        if (resultCode != Activity.RESULT_OK) return null
        return intent?.getStringExtra(LauncherActivity.SOME_KEY) // Достаем значение
    }
}

contract.launch("Your content goes here") // Запускаем  передав нужное значение

И не забудьте поменять ключ при отправке результата из другой активити.

З.Ы. Не совсем понимаю каким образом обсервинг чего-то должен запускать активити, может все же на кнопку какую забиндите?

→ Ссылка