iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
Mobile Development

寫Jetpack Compose ,會很有畫面哦!系列 第 28

寫Jetpack Compose ,會很有畫面哦! - Day28 Compose 和其他程式庫

  • 分享至 

  • xImage
  •  

Compose 和其他程式庫

 可以用Compose 加入一些最為實用的程式庫。

取得 Activity 結果

rememberLauncherForActivityResult() API 可助您從可組合項中取得 Activity 結果

@Composable
fun Greeting(name: String) {
	var imageUri by remember { mutableStateOf<Uri?>(null) }
    val launcher = rememberLauncherForActivityResult(GetContent()) { uri: Uri? ->
        imageUri = uri
    }
    Column {
        Button(onClick = { launcher.launch("image/*") }) {
            Text(text = "Load Image")
        }
        Image(
            painter = rememberImagePainter(imageUri),
            contentDescription = "My Image"
        )
    }
}

顯示結果:
https://ithelp.ithome.com.tw/upload/images/20221004/20121643NZxoOviiQi.png
https://ithelp.ithome.com.tw/upload/images/20221004/201216438USOXgrdBY.png
https://ithelp.ithome.com.tw/upload/images/20221004/20121643uey3oMfpgn.png

處理系統返回按鈕

可組合項可以使用 BackHandler 以攔截 Back key 事件
@Composable
fun Greeting(name: String) {
	...	
    var backHandlingEnabled by remember { mutableStateOf(true) }
    BackHandler(backHandlingEnabled) {
        // Handle back press
        Log.d("kevin","press back key")
    }
	...
}

顯示結果:
https://ithelp.ithome.com.tw/upload/images/20221004/20121643QqwRYhUcpM.png

圖片載入

Instacart 的 Coil 程式庫提供透過外部來源載入圖片的可組合函式,例如透過網路載入遠端圖片。

權限

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

build.gradle

implementation("io.coil-kt:coil-compose:2.2.1")
@Composable
fun Greeting(name: String) {
	...	
       val painter = rememberAsyncImagePainter(
        ImageRequest.Builder(LocalContext.current).data(data = "https://picsum.photos/300/300")
            .apply(block = fun ImageRequest.Builder.() {
                crossfade(true)
            }).build()
    )

    Box {
        Image(
            painter = painter,
            contentDescription = stringResource(R.string.image_content_desc),
            modifier = Modifier.align(Alignment.Center)
        )

        when (painter.state) {
            is AsyncImagePainter.State.Loading -> {
                // Display a circular progress indicator whilst loading
                Log.d("kevin","load image ...")
            }
            is AsyncImagePainter.State.Error -> {
                // If you wish to display some content if the request fails
            }
        }
    }	...
}

顯示結果:

https://ithelp.ithome.com.tw/upload/images/20221004/20121643mV54vFvPo6.png

https://ithelp.ithome.com.tw/upload/images/20221004/20121643YLHjcoeT7j.png

參考:

https://developer.android.com/jetpack/compose/libraries

Kotlin 的技術傳教士 - 范聖佑 近期也出了一本關於 Collection 的書 - Kotlin Collection 全方位解析攻略
裡面也有蠻多 operator 的介紹,歡迎大家有興趣的參考看看
https://www.tenlong.com.tw/products/9786263331136


上一篇
寫Jetpack Compose ,會很有畫面哦! - Day 27 Compose 中的 ViewModel
下一篇
寫Jetpack Compose ,會很有畫面哦! - Day29 Compose 測試撰寫版面配置
系列文
寫Jetpack Compose ,會很有畫面哦!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言