Skip to content

Instantly share code, notes, and snippets.

View mattrob33's full-sized avatar

Matt Robertson mattrob33

View GitHub Profile
///
/// A subclass of ``XCTestCase`` that supports async setup and teardown.
///
class XCAsyncTestCase: XCTestCase {
func asyncSetUpWithError() async throws {
fatalError("Must override")
}
func asyncTearDownWithError() async throws {
@mattrob33
mattrob33 / rememberState.kt
Created June 14, 2023 01:34
rememberState
/**
* Shorthand for
*
* ```
* remember {
* mutableStateOf(...)
* }
* ```
*/
@Composable
@mattrob33
mattrob33 / rememberStateUsage.kt
Created June 14, 2023 01:42
rememberState usage
@Composable fun Screen(
url: String
) {
var count by rememberState { 0 }
val content by rememberState(url) { load(url) }
}
inline fun Modifier.clickable(crossinline onClick: () -> Unit): Modifier = composed {
clickable(
indication = rememberRipple(),
interactionSource = remember { MutableInteractionSource() }
) {
onClick()
}
}
@Composable fun ClickableText(
text: String,
onClick: () -> Unit
) {
Text(
text = text,
modifier = Modifier.clickable(onClick)
)
}
inline fun Modifier.noRippleClickable(crossinline onClick: () -> Unit): Modifier = composed {
clickable(
indication = null,
interactionSource = remember { MutableInteractionSource() }
) {
onClick()
}
}
fun Modifier.consumeTaps(): Modifier = composed {
clickable(
indication = null,
interactionSource = remember { MutableInteractionSource() }
) {}
}
@Composable fun Screen(
onDismiss: () -> Unit
) {
Topbar(
onDismiss = onDismiss,
modifier = Modifier.consumeTaps()
)
..
}
/**
* Intercept [MotionEvent.ACTION_DOWN] events.
*/
fun Modifier.onPress(pressHandler: (offset: Offset) -> Unit): Modifier {
return this.pointerInteropFilter { event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> pressHandler(Offset(event.x, event.y))
else -> return@pointerInteropFilter false
}
true
@Composable fun Screen() {
var pressedLocation by rememberState { null }
MaxSizeBox(
modifier = Modifier.onPress { pressedLocation = it }
) {
..
}
}