此函数具有具体化类型参数,因此只能在编译时内联,不能直接调用
This function has a reified type parameter and thus can only be inlined at compilation time, not called directly
我有以下编译代码,但运行时崩溃
@Composable
fun Launcher() {
val context = LocalContext.current
LazyColumn(modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally) {
item {
context.StartActivityButton<LaunchedEffectActivity>()
}
}
}
@Composable
private inline fun <reified T : Activity>Context.StartActivityButton() {
Button(onClick = {
startActivity(Intent(this, T::class.java))
}) {
Text(T::class.toString())
}
}
错误是
Caused by: java.lang.UnsupportedOperationException: This function has a reified type parameter and thus can only be inlined at compilation time, not called directly.
at kotlin.jvm.internal.Intrinsics.throwUndefinedForReified(Intrinsics.java:207)
at kotlin.jvm.internal.Intrinsics.throwUndefinedForReified(Intrinsics.java:201)
at kotlin.jvm.internal.Intrinsics.needClassReification(Intrinsics.java:219)
at com.example.composesideeffects.ComposableSingletons$MainActivityKt.<clinit>(MainActivity.kt:52)
at com.example.composesideeffects.MainActivity.onCreate(MainActivity.kt:25)
at android.app.Activity.performCreate(Activity.java:7994)
at android.app.Activity.performCreate(Activity.java:7978)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
我已经为我的 reified
使用了 inline
。我错过了什么?
这似乎是一个错误,我建议你report it。
内联操作效果很好:
private inline fun <reified T : Activity> Context.startActivity() {
startActivity(Intent(this, T::class.java))
}
// ..
Button(onClick = {
context.startActivity<MainActivity>()
}) {
}
创建可组合函数作为 Context
的扩展对我来说似乎很奇怪:您可以在任何可组合项中获得 LocalContext.current
。
以下是无需内联即可执行相同操作的方法:
@Composable
private fun StartActivityButton(activityClass: Class<*>) {
val context = LocalContext.current
Button(onClick = {
context.startActivity(Intent(context, activityClass))
}) {
}
}
用法:
StartActivityButton(LaunchedEffectActivity::class.java)
我有以下编译代码,但运行时崩溃
@Composable
fun Launcher() {
val context = LocalContext.current
LazyColumn(modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally) {
item {
context.StartActivityButton<LaunchedEffectActivity>()
}
}
}
@Composable
private inline fun <reified T : Activity>Context.StartActivityButton() {
Button(onClick = {
startActivity(Intent(this, T::class.java))
}) {
Text(T::class.toString())
}
}
错误是
Caused by: java.lang.UnsupportedOperationException: This function has a reified type parameter and thus can only be inlined at compilation time, not called directly.
at kotlin.jvm.internal.Intrinsics.throwUndefinedForReified(Intrinsics.java:207)
at kotlin.jvm.internal.Intrinsics.throwUndefinedForReified(Intrinsics.java:201)
at kotlin.jvm.internal.Intrinsics.needClassReification(Intrinsics.java:219)
at com.example.composesideeffects.ComposableSingletons$MainActivityKt.<clinit>(MainActivity.kt:52)
at com.example.composesideeffects.MainActivity.onCreate(MainActivity.kt:25)
at android.app.Activity.performCreate(Activity.java:7994)
at android.app.Activity.performCreate(Activity.java:7978)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
我已经为我的 reified
使用了 inline
。我错过了什么?
这似乎是一个错误,我建议你report it。
内联操作效果很好:
private inline fun <reified T : Activity> Context.startActivity() {
startActivity(Intent(this, T::class.java))
}
// ..
Button(onClick = {
context.startActivity<MainActivity>()
}) {
}
创建可组合函数作为 Context
的扩展对我来说似乎很奇怪:您可以在任何可组合项中获得 LocalContext.current
。
以下是无需内联即可执行相同操作的方法:
@Composable
private fun StartActivityButton(activityClass: Class<*>) {
val context = LocalContext.current
Button(onClick = {
context.startActivity(Intent(context, activityClass))
}) {
}
}
用法:
StartActivityButton(LaunchedEffectActivity::class.java)