E-posta oluşturma ve diğer kitaplıklar

Compose'da favori kitaplıklarınızı kullanabilirsiniz. Bu bölümde, projenizin en yararlı kitaplıklardan birkaçını ekledik.

Etkinlik

Oluştur özelliğini bir etkinlikte kullanmak için ComponentActivity Activity için uygun LifecycleOwner ve bileşenlerine ayıralım. Ayrıca, kodunuzu birbirinden ayıran ek API'ler de sunar. geçersiz kılma yöntemlerinden bahsedeceğiz. Etkinlik Oluşturma bu API'leri, composable'lara veya açık bir Activity örneğinin alınmasına artık gerek yoktur. Dahası, bu API'ler yalnızca bir kez başlatılır. yeniden derleme işlemini ve composable'ın bileşimi.

Etkinlik Sonucu

İlgili içeriği oluşturmak için kullanılan rememberLauncherForActivityResult() API sayesinde bir etkinlikten sonuç alma inceleyebilirsiniz:

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

Bu örnekte, basit bir GetContent() sözleşme imzalamaz. Düğmeye dokunduğunuzda istek başlatılır. Şu lambdanın sondaki lambda: rememberLauncherForActivityResult() , kullanıcı bir resim seçip başlatma etkinliğine geri döndüğünde çağrılır. Bu işlem, seçili resmi Coil'in rememberImagePainter() özelliğini kullanarak yükler işlevini kullanın.

Şunun herhangi bir alt sınıfı: ActivityResultContract ilk bağımsız değişken olarak rememberLauncherForActivityResult(). Yani bu tekniği, çerçeveden içerik istemek için kullanabilirsiniz. yaygın bir şekilde ele alacağız. Kendi feed'inizi de oluşturabilirsiniz özel sözleşmeler yapabilir ve bunları inceleyeceğiz.

Çalışma zamanında istenen izin

Aynı Activity Result API ve rememberLauncherForActivityResult() yukarıda açıklandığı gibi, çalışma zamanında istenen izin her bir arama terimi için RequestPermission tek bir izin için sözleşmeye tabi RequestMultiplePermissions birden fazla izin için sözleşme imzalaması gerekir.

İlgili içeriği oluşturmak için kullanılan Refakatçi İzinleri kitaplığı bu API’lerin üzerindeki bir katman da kullanılabilir. İzinleri Oluştur kullanıcı arayüzünüzün kullanabileceği Duruma bildirir.

Sistem geri düğmesini kullanma

Özel geri gezinme sağlamak için ve sistem geri düğmesinin varsayılan davranışını composable, BackHandler olaya müdahale etmek için:

var backHandlingEnabled by remember { mutableStateOf(true) }
BackHandler(backHandlingEnabled) {
    // Handle back press
}

İlk bağımsız değişken, BackHandler şu anda etkin; işleyicinizi geçici olarak devre dışı bırakmak için bu bağımsız değişkeni kullanabilirsiniz bileşeninizin durumuna göre değiştirebilirsiniz. Sonraki lambda kullanıcı bir sistem geri etkinliğini tetiklediğinde BackHandler şu anda etkin.

ViewModel

Mimari Bileşenleri ViewModel kitaplığına giderek Herhangi bir composable'dan ViewModel viewModel() işlevini kullanın. Gradle dosyanıza şu bağımlılığı ekleyin:

Eski

dependencies {
    implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1'
}

Kotlin

dependencies {
    implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1")
}

Daha sonra kodunuzda viewModel() işlevini kullanabilirsiniz.

class MyViewModel : ViewModel() { /*...*/ }

// import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun MyScreen(
    viewModel: MyViewModel = viewModel()
) {
    // use viewModel here
}

viewModel(), mevcut bir ViewModel değerini döndürür veya yeni bir tane oluşturur. Varsayılan olarak döndürülen ViewModel öğesini çevreleyen etkinliğin, parçanın veya gezinme hedefi gösterilir ve kapsam aktif olduğu sürece saklanır.

Örneğin, composable bir etkinlikte kullanılırsa viewModel(), devam ettirilene veya işlem sonlandırılana kadar aynı işlemi tekrarlar.

class MyViewModel : ViewModel() { /*...*/ }
// import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun MyScreen(
    // Returns the same instance as long as the activity is alive,
    // just as if you grabbed the instance from an Activity or Fragment
    viewModel: MyViewModel = viewModel()
) { /* ... */ }

@Composable
fun MyScreen2(
    viewModel: MyViewModel = viewModel() // Same instance as in MyScreen
) { /* ... */ }

Kullanım kuralları

Genellikle ViewModel örneğe ekran düzeyinde erişirsiniz composable'lar, yani bir etkinlikten çağrılan kök composable'a yakın bir Gezinme grafiğinin parçası veya hedefidir. Bunun nedeni ViewModel varsayılan olarak ekran düzeyindeki bu nesnelere ayarlanır. Şu konu hakkında daha fazla bilgi edinin: ViewModel yaşam döngüsünü ve kapsamı burada bulabilirsiniz.

Aşağı düşmemeye çalışın Diğer composable'ları oluşturabileceği için ViewModel örnekleri test edilmesi daha zordur ve bozulabilir önizleme Bunun yerine işlevleri ve işlevleri parametre olarak kullanır.

ViewModel örneğini şunlar için kullanabilirsiniz: alt ekran düzeyindeki composable'lar için durumu yönetin, ancak ViewModel yaş döngüsü ve kapsamı hakkında bilgi edinin. Öğe composable'ın bağımsız olması durumunda, bunun için Hilt'ı bağımlılıkları üst öğeden iletmek zorunda kalmamak için ViewModel öğesini ekleyin composables.

ViewModel metriğinizde bağımlılıklar varsa viewModel() için isteğe bağlı ViewModelProvider.Factory kullanabilirsiniz.

Compose'da ViewModel ve örneklerin nasıl kullanıldığı hakkında daha fazla bilgi gezinme menüsü kitaplığı veya etkinlikleri ve parçalarıyla, Birlikte çalışabilirlik belgelerine bakın.

Veri akışları

Compose, Android'in en popüler akış tabanlı çözümlerine yönelik uzantılarla birlikte gelir. Bu uzantıların her biri farklı bir yapıyla sağlanır:

Bu eserler bir dinleyici olarak kaydedilir ve değerleri State. Yeni bir değer ileti yayınlandığında, Compose, kullanıcı arayüzünde state.value öğesinin kullanılır. Örneğin, bu kodda ShowData her seferinde yeniden oluşturur exampleLiveData yeni bir değer yayar.

// import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun MyScreen(
    viewModel: MyViewModel = viewModel()
) {
    val dataExample = viewModel.exampleLiveData.observeAsState()

    // Because the state is read here,
    // MyScreen recomposes whenever dataExample changes.
    dataExample.value?.let {
        ShowData(dataExample)
    }
}

Compose'da eşzamansız işlemler

Jetpack Compose, emin olmanız gerekir.

Şuradaki LaunchedEffect, produceState ve rememberCoroutineScope API'lerini görün: daha fazla bilgi için yan efektler dokümanlarına ekleyebilirsiniz.

Gezinme bileşeni, Jetpack Compose uygulamaları için destek sağlar. Oluşturma ile gezinme başlıklı makaleyi inceleyin ve Daha fazla bilgi için Jetpack Gezinme'yi Gezinme Oluşturma'ya taşıyın.

Sap

Hilt, Android uygulamalarında bağımlılık yerleştirme için önerilen çözümdür. Compose ile sorunsuz şekilde çalışır.

ViewModel bölümünde bahsedilen viewModel() işlevi Hilt'in, @HiltViewModel ile oluşturduğu ViewModel'i otomatik olarak kullanır ek açıklaması da yer alır. Hilt'ın ViewModel'i hakkında bilgi içeren entegrasyonu ile ilgili talimatları uygulayın.

@HiltViewModel
class MyViewModel @Inject constructor(
    private val savedStateHandle: SavedStateHandle,
    private val repository: ExampleRepository
) : ViewModel() { /* ... */ }

// import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun MyScreen(
    viewModel: MyViewModel = viewModel()
) { /* ... */ }

Kamuflaj ve Gezinme

Hilt, Gezinme Oluşturma Kitaplığı kitaplığıyla da entegre olur. Aşağıdakileri ekleyin: Gradle dosyanıza ek bağımlılıklar deneyin:

Eski

dependencies {
    implementation 'androidx.hilt:hilt-navigation-compose:1.0.0'
}

Kotlin

dependencies {
    implementation("androidx.hilt:hilt-navigation-compose:1.0.0")
}

Yazma Gezinme menüsünde her zaman hiltViewModel composable'ı kullan işlevini kullanın.@HiltViewModelViewModel Bu, @AndroidEntryPoint

Örneğin ExampleScreen, gezinme grafiğinde bir hedefse ExampleViewModel kapsamlı bir örnek almak için hiltViewModel() çağrısı öğesini aşağıdaki kod snippet'inde gösterildiği gibi hedefe ekleyin:

// import androidx.hilt.navigation.compose.hiltViewModel

@Composable
fun MyApp() {
    val navController = rememberNavController()
    val startRoute = "example"
    NavHost(navController, startDestination = startRoute) {
        composable("example") { backStackEntry ->
            // Creates a ViewModel from the current BackStackEntry
            // Available in the androidx.hilt:hilt-navigation-compose artifact
            val viewModel = hiltViewModel<MyViewModel>()
            MyScreen(viewModel)
        }
        /* ... */
    }
}

Şu kapsamdaki bir ViewModel örneğini almanız gerekiyorsa: navigasyon rotaları veya gezinme grafiği bunun yerine hiltViewModel composable işlevini kullanın ve ilgili Parametre olarak backStackEntry:

// import androidx.hilt.navigation.compose.hiltViewModel
// import androidx.navigation.compose.getBackStackEntry

@Composable
fun MyApp() {
    val navController = rememberNavController()
    val startRoute = "example"
    val innerStartRoute = "exampleWithRoute"
    NavHost(navController, startDestination = startRoute) {
        navigation(startDestination = innerStartRoute, route = "Parent") {
            // ...
            composable("exampleWithRoute") { backStackEntry ->
                val parentEntry = remember(backStackEntry) {
                    navController.getBackStackEntry("Parent")
                }
                val parentViewModel = hiltViewModel<ParentViewModel>(parentEntry)
                ExampleWithRouteScreen(parentViewModel)
            }
        }
    }
}

Sayfalama

Sayfalama kitaplık Bu özellik, verileri kademeli olarak yüklemenizi kolaylaştırır ve Oluşturma'da desteklenir. Çağrı sürümü page şunu içerir: eklenmesi gereken fazladan paging-compose bağımlılığı hakkında bilgi ve kendi sürümüne göre değişir.

Sayfalama kitaplığının Compose API'lerine ilişkin bir örneği burada bulabilirsiniz:

@Composable
fun MyScreen(flow: Flow<PagingData<String>>) {
    val lazyPagingItems = flow.collectAsLazyPagingItems()
    LazyColumn {
        items(
            lazyPagingItems.itemCount,
            key = lazyPagingItems.itemKey { it }
        ) { index ->
            val item = lazyPagingItems[index]
            Text("Item is $item")
        }
    }
}

Daha fazla bilgi için Listeler ve ızgaralar dokümanlarına göz atın ile ilgili daha fazla bilgi edinin.

Haritalar

Haritalar'da Oluşturma özelliğini kullanabilirsiniz uygulamanızda Google Haritalar'ı sunmak için. Aşağıda bir kullanım örneği verilmiştir:

@Composable
fun MapsExample() {
    val singapore = LatLng(1.35, 103.87)
    val cameraPositionState = rememberCameraPositionState {
        position = CameraPosition.fromLatLngZoom(singapore, 10f)
    }
    GoogleMap(
        modifier = Modifier.fillMaxSize(),
        cameraPositionState = cameraPositionState
    ) {
        Marker(
            state = MarkerState(position = singapore),
            title = "Singapore",
            snippet = "Marker in Singapore"
        )
    }
}

ziyaret edin.