简介:Java 中有一个复杂的项目,目前正在使用 Jetpack Compose(特别是 Composable 函数)在 Kotlin 中进行模块化重写。在不同活动之间传递额外参数的旧实现是典型的(通过意图):
主活动(java):
button.setOnClickListener(v -> {
startActivityForResult(new Intent(MainActivity.this, SecondActivity.class), 1234);
});
.....
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1234 && resultCode == RESULT_OK) {
//TODO Здесь какие-то действия (например получение инта)
}
}
SecondActivity(java):
int intPosition = 7
backButton.setOnClickListener(view -> {
Intent intent = new Intent();
intent.putExtra("result", intPosition);
setResult(RESULT_OK, intent);
finish();
});
但是,过渡到 Composable 的新实现意味着使用 BackHandler 和 OnBackPressedDispatcher,下面是示例:
第二项活动(带有@Composable的kotlin):
class SecondActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MaterialTheme {
PatternPager()
}
}
}
}
@Composable
fun PatternPager() {
val onBackPressedDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
val onBackToActivity = {
println("back pressed")
scope.launch {
awaitFrame()
onBackPressedDispatcher?.onBackPressed()
}
}
Box(...) {
Row(...) {
...
Button(
onClick = {
scope.launch {
//TODO Здесь логика перехода
onBackToActivity()
}
}
}
}
问题是,需要在 MainActivity.java 文件中做哪些更改,才能在类似于 onActivityResult 的 PatternPager() 函数中接受来自 @Composable 的更改,以及如何将来自 @Composable 的更改发送到 java。
转换已经实现,您只需要传递额外内容。这个任务并不容易,因为 MainActivity 需要以 java 格式保存。
我向那些遇到过项目从 Java 到 Kotlin 部分迁移的人寻求帮助和建议/假设。