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

Oluştur'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. Activity Compose, bu API'leri composable'lara gösterir. Böylece, composable'larınızın dışındaki yöntemleri geçersiz kılma veya açık bir Activity örneği alma artık gerekli değildir. Dahası, bu API'ler yalnızca bir kez başlatılır. yeniden derleme işlemini ve composable'ın bileşimi.

Etkinlik Sonucu

rememberLauncherForActivityResult() API, aşağıdakiler gibi bir bileşeninizde bir etkinlikten sonuç almanıza olanak tanır:

@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şmesi gösterilmektedir. 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 ve bileşeninizden sistem geri düğmesinin varsayılan davranışını geçersiz kılmak için bileşeniniz bu etkinliği durdurmak üzere bir BackHandler kullanabilir:

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 veya bileşeninizin durumuna göre değişir. 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:

Groovy

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

Kotlin

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

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, kapsayıcı etkinlik, parça veya gezinme hedefi kapsamına alınır ve kapsam etkin olduğu sürece saklanır.

Örneğin, bir etkinlikte kullanılan viewModel(), etkinlik tamamlanana veya işlem sonlandırılana kadar aynı örneği döndürür.

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'lerin varsayılan olarak bu ekran düzeyindeki nesnelerle kapsamlı olmasıdır. ViewModel'nin yaşam döngüsü ve kapsamı hakkında daha fazla bilgiyi 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, yalnızca ihtiyaç duydukları verileri ve işlevleri parametre olarak iletin.

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ı tarafından sağlanır:

Bu eserler bir dinleyici olarak kaydedilir ve değerleri State. Yeni bir değer her oluşturulduğunda, Compose, state.value değerinin kullanıldığı kullanıcı arayüzü bölümlerini yeniden oluşturur. Ö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)
    }
}

Oluşturma'daki eşzamansız işlemler

Jetpack Compose, kompozisyonlarınızdan coroutine'leri kullanarak eşzamansız işlemler yürütmenize olanak tanır.

Ş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, Navigation Compose kitaplığıyla da entegre edilebilir. Aşağıdakileri ekleyin: Gradle dosyanıza ek bağımlılıklar deneyin:

Eski

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

Kotlin

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

Gezinme Oluşturma'yı kullanırken, @HiltViewModel ek açıklamalı ViewModel öğenizin bir örneğini almak için daima hiltViewModel composable işlevini kullanın. Bu özellik, @AndroidEntryPoint ile ek açıklama eklenmiş parçalar veya etkinliklerde kullanılabilir.

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

// 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)
            }
        }
    }
}

Sayfa ayırma

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 Oluşturma API'leri örneğini aşağıda 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")
        }
    }
}

Oluşturma'da sayfalama özelliğini kullanma hakkında daha fazla bilgi için Listeler ve ızgaralar dokümanlarına göz atın.

Haritalar

Uygulamanızda Google Haritalar'ı sağlamak için Haritalar Compose kitaplığını kullanabilirsiniz. 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 = remember { MarkerState(position = singapore) },
            title = "Singapore",
            snippet = "Marker in Singapore"
        )
    }
}