manueldidonna
09/12/2020, 4:18 PM@Stable
@Composable
fun <I, O> activityResultLauncher(
contractKey: String,
contract: ActivityResultContract<I, O>,
activityResultCallback: ActivityResultCallback<O>,
): ActivityResultLauncher<I> {
val lifecycleOwner = LifecycleOwnerAmbient.current
val registry = ActivityResultRegistryAmbient.current
val launcher = remember(contract, registry, contractKey) {
registry.register(contractKey, lifecycleOwner, contract, activityResultCallback)
}
onDispose {
launcher.unregister()
}
return launcher
}
@Composable
fun ImportSaveDataFromFile(onImport: (SaveData?) -> Unit) {
val context = ContextAmbient.current
var launchActivity by savedInstanceState { false }
val activityLauncher = activityResultLauncher("ImportSaveData", OpenDocumentContract) { uri: Uri? ->
onImport(createSaveData(uri, context))
}
if (launchActivity) {
launchActivity = false
activityLauncher.launch(arrayOf("*/*"))
}
Surface(modifier = Modifier.fillMaxSize()) {
Button(
modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center),
onClick = { launchActivity = true }
) {
Text(text = "IMPORT SAVE DATA")
}
}
}
Adam Powell
09/12/2020, 4:23 PMlaunchActivity
state. That's not state, it's an eventactivityLauncher.launch
in your onClick
manueldidonna
09/12/2020, 5:02 PMprivate object MainState {
var saveData by mutableStateOf<SaveData?>(null)
var currentScreen by mutableStateOf<MainScreen>(MainScreen.Root)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MaterialTheme {
Providers(ActivityResultRegistryAmbient provides activityResultRegistry,) {
val saveData: SaveData? = MainState.saveData
if (saveData == null) {
ImportSaveDataFromFile {
// this is the 'onImport' callback of the precedent code snippet.
// this callback is invocked, the 'it' object is the right object but MainScreen
// in the else statement doesn't show until I rotate the activity again
MainState.saveData = it
}
} else {
MainScreen(saveData = saveData)
}
}
}
}
}
val saveData: SaveData? = MainState.saveData
Log.d("intent", "create")
if (saveData == null) {
ImportSaveDataFromFile {
MainState.saveData = it
Log.d("intent","savedata: ${MainState.saveData}")
}
} else {
MainScreen(
screen = MainState.currentScreen,
saveData = saveData,
events = this
)
}
Sean McQuillan [G]
09/14/2020, 6:13 PM