How to get Context in Jetpack Compose

fun createListItem(itemIndex: Int) { Padding(left = 8.dp, right = 8.dp, top = 8.dp, bottom = 8.dp) { FlexRow(crossAxisAlignment = CrossAxisAlignment.Center) { expanded(1.0f) { Text("Item $itemIndex") } inflexible { Button( "Button $itemIndex", style = ContainedButtonStyle(), onClick = { Toast.makeText( this@MainActivity, "Item name $itemIndex", Toast.LENGTH_SHORT ).show() }) } } }
}

I try to make Toast in a normal way. but I got the error I tried a lot of multiples source but failed.

2

12 Answers

Update March 2021: The previous answer has been deprecated. You should now use:

val context = LocalContext.current

Previous answer for reference:

You can access to context with define ambientContext.

Example:

val context = ContextAmbient.current
7

ContextAmbient and AmbientContext has been deprecated.

You can replace them with LocalContext

Example:

val context = LocalContext.current
2

ContextAmbient.current is deprecated as of alpha-09.

AmbientContext.current is deprecated. I think as of alpha-11.

LocalContext.current is how you get the context in a composable now.

0

The way to do this has been updated. It's now:

val context = LocalContext.current

LocalContext docs

ContextAmbient and AmbientContext is deprecated

Update

Now Jetpack way to do this has been updated. It's now:

val context = LocalContext.current
2

LocalContext.current - is the right approach. But the problem is you can't use LocalContext.current inside @Composable function

You need to create separate function to use Context

Sample code

@Composable
fun DoneButton() { val context = LocalContext.current Button(onClick = { showToast(context, "Button clicked")}) { Text(name = "Done") }
}
fun showToast(context: Context, msg: String) { Toast.makeText(context, msg, Toast.LENGTH_LONG).show()
}

ContextAmbient.current has been deprecated, use val context = LocalContext.current instead.

0

Some useful if you need get context as Activity from last Android Studio template:

val view = LocalView.current
(view.context as Activity).<activity method>

Better solution

fun Context.getActivity(): Activity? = when (this) { is Activity -> this is ContextWrapper -> baseContext.getActivity() else -> null
}
val activity = LocalContext.current.getActivity()
2

For getting context in jetpack compose:

val context = ContextAmbient.current

Working on 0.1.0-dev14

How to use it in TOAST:

@Composable
fun cardViewImplementer(item: Int) { val context = ContextAmbient.current Card( shape = RoundedCornerShape(10.dp), modifier = Modifier.padding(10.dp) ) { Box( modifier = Modifier .fillMaxWidth() .drawShadow(5.dp) .clickable(onClick = { Toast.makeText(context, "Clicked $item", Toast.LENGTH_SHORT).show() }), children = { })
}

For accessing the Resource:

Text("Read this string: "+context.getString(R.string.name))

Issues with compose_version = '1.0.0-alpha12' ? AmbientContext is now LocalContext

val context = LocalContext.current
Toast.makeText(context,"Hello Compose",Toast.LENGTH_LONG).show()

You can use the LocalUriHandler:

val handler = LocalUriHandler.currenthandler
Button( onClick = { handler.openUri("") }
) { Text("Open")
} 

You Might Also Like