Compose'da favori kitaplıklarınızı kullanabilirsiniz. Bu bölümde en yararlı kitaplıklardan birkaçının nasıl dahil edileceği açıklanmaktadır.
Etkinlik
Compose'u bir etkinlikte kullanmak için Compose'a uygun LifecycleOwner
ve bileşenleri sağlayan bir Activity
alt sınıfı olan ComponentActivity
'i kullanmanız gerekir. Ayrıca, etkinlik sınıfınızda kodunuzu geçersiz kılma yöntemlerinden ayıran ek API'ler de sağlar.
Activity Compose, bu API'leri composable'lara maruz bırakır. Böylece, composable'larınızın dışındaki yöntemleri geçersiz kılmanıza veya açık bir Activity
örneği almanıza gerek kalmaz.
Dahası, bu API'ler yalnızca bir kez başlatılmasını, yeniden oluşturulmadan dayanmasını ve composable'ın besteden kaldırılması halinde düzgün bir şekilde temizlenmesini sağlar.
Etkinlik Sonucu
rememberLauncherForActivityResult()
API, composable dosyanızdaki bir etkinlikten sonuç almanızı sağlar:
@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. Kullanıcı bir resim seçip başlatma etkinliğine geri döndüğünde, rememberLauncherForActivityResult()
için sondaki lambda çağrılır.
Bu işlem, seçili resmi Coil'in rememberImagePainter()
işlevini kullanarak yükler.
Tüm ActivityResultContract
alt sınıfları, rememberLauncherForActivityResult()
bağımsız değişkeni olarak kullanılabilir.
Yani bu tekniği, çerçeveden ve diğer yaygın kalıplardan içerik istemek için kullanabilirsiniz. Ayrıca kendi özel sözleşmelerinizi oluşturabilir ve bunları bu teknikle kullanabilirsiniz.
Çalışma zamanında istenen izin
Yukarıda açıklanan Activity Result API'si ve rememberLauncherForActivityResult()
, tek bir izin için RequestPermission
sözleşmesini veya birden fazla izin için RequestMultiplePermissions
sözleşmeyi kullanarak çalışma zamanında istenen izinleri istemek amacıyla kullanılabilir.
Accompanist İzinleri kitaplığı, bu API'lerin üzerindeki bir katmanla da izinler için verilen mevcut durumu Compose kullanıcı arayüzünüzün kullanabileceği Durum ile eşlemek amacıyla kullanılabilir.
Sistem geri düğmesini kullanma
Özel geri gezinme sağlamak ve sistem geri düğmesinin varsayılan davranışını composable'ınızdan geçersiz kılmak için composable'ınız bu etkinliğe müdahale etmek üzere bir BackHandler
kullanabilir:
var backHandlingEnabled by remember { mutableStateOf(true) } BackHandler(backHandlingEnabled) { // Handle back press }
İlk bağımsız değişken, BackHandler
öğesinin şu anda etkin olup olmadığını kontrol eder. Bileşeninizin durumuna göre işleyicinizi geçici olarak devre dışı bırakmak için bu bağımsız değişkeni kullanabilirsiniz. Kullanıcı bir sistem geri etkinliğini tetiklerse takip eden lambda çağrılır ve BackHandler
şu anda etkindir.
ViewModel
Mimari Bileşenleri ViewModel kitaplığını kullanırsanız viewModel()
işlevini çağırarak herhangi bir composable'dan ViewModel
öğesine erişebilirsiniz. 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
, çevreleyen etkinliğe, parçaya veya gezinme hedefine ayarlanır ve kapsam yayında olduğu sürece saklanır.
Örneğin, composable bir etkinlikte kullanılırsa 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ı
ViewModel
örneklerine genellikle ekran düzeyinde composable'larda, yani bir Gezinme grafiğinin etkinliğinden, parçasından veya hedefinden çağrılan kök composable'ın yakınında erişirsiniz. Bunun nedeni, ViewModel
öğelerinin varsayılan olarak ekran düzeyindeki bu nesnelerin kapsamında olmasıdır. ViewModel
ürününün yaşam döngüsü ve kapsamı hakkında daha fazla bilgiyi buradan edinebilirsiniz.
ViewModel
örneklerini diğer composable'lara iletmekten kaçınmaya çalışın. Aksi halde bu composable'ların test edilmesi daha zor olabilir ve önizlemeleri bozabilir. Bunun yerine, yalnızca ihtiyaç duydukları verileri
ve işlevleri parametre olarak iletin.
Alt ekran düzeyindeki composable'ların durumunu yönetmek için ViewModel
örneklerini kullanabilirsiniz ancak ViewModel
öğesinin yaşam döngüsüne ve kapsamına dikkat edin. composable bağımsız bir öğeyse bağımlılıkları üst composable'lardan aktarmak zorunda kalmamak için ViewModel
öğesini yerleştirmek için Hilt'ı kullanabilirsiniz.
ViewModel
öğenizde bağımlılıklar varsa viewModel()
parametre olarak isteğe bağlı bir ViewModelProvider.Factory
alır.
Compose'da ViewModel
ve örneklerin Yazma Gezinme kitaplığıyla veya etkinlikler ve parçalarla nasıl kullanıldığı hakkında daha fazla bilgi için 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:
LiveData.observeAsState()
,androidx.compose.runtime:runtime-livedata:$composeVersion
yapıya dahil edildi.Flow.collectAsState()
, ekstra bağımlılık gerektirmez.androidx.compose.runtime:runtime-rxjava2:$composeVersion
veyaandroidx.compose.runtime:runtime-rxjava3:$composeVersion
yapısınaObservable.subscribeAsState()
eklenmiş.
Bu yapılar bir işleyici olarak kaydedilir ve değerleri bir State
olarak temsil eder. Yeni bir değer paylaşıldığında Compose, kullanıcı arayüzünde state.value
kullanılan bu bölümleri yeniden oluşturur. Örneğin, bu kodda ShowData
, exampleLiveData
her yeni değer yayınladığında yeniden oluşturur.
// 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, composable'larınızdaki eş yordamlar kullanarak eşzamansız işlemler gerçekleştirmenizi sağlar.
Daha fazla bilgi için yan efektler dokümanlarındaki LaunchedEffect
, produceState
ve rememberCoroutineScope
API'lerine bakın.
Navigasyon
Gezinme bileşeni, Jetpack Compose uygulamaları için destek sağlar. Daha fazla bilgi için Compose ile gezinme ve Jetpack Navigation Compose'a taşıma konularına bakın.
Sap
Hilt, Android uygulamalarında bağımlılık ekleme için önerilen çözümdür ve Compose ile sorunsuz bir şekilde çalışır.
ViewModel bölümünde belirtilen viewModel()
işlevi, Hilt'in @HiltViewModel
ek açıklamasıyla oluşturduğu ViewModel'i otomatik olarak kullanır. Hilt'in ViewModel entegrasyonu hakkında bilgi içeren belgeler sağladık.
@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. Gradle dosyanıza aşağıdaki ek bağımlılıkları ekleyin:
Eski
dependencies { implementation 'androidx.hilt:hilt-navigation-compose:1.0.0' }
Kotlin
dependencies { implementation("androidx.hilt:hilt-navigation-compose:1.0.0") }
Gezinme Oluşturma Aracı'nı kullanırken, @HiltViewModel
ek açıklamalı ViewModel
öğenizin bir örneğini almak için her zaman hiltViewModel
composable işlevini kullanın.
Bu işlev, @AndroidEntryPoint
ile ek açıklama eklenen parçalar veya etkinliklerle çalışır.
Örneğin, ExampleScreen
gezinme grafiğinde bir hedefse aşağıdaki kod snippet'inde gösterildiği gibi hedefe yönelik ExampleViewModel
örneğini almak için hiltViewModel()
yöntemini ç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) } /* ... */ } }
Bunun yerine gezinme rotalarına veya gezinme grafiğine odaklanan bir ViewModel
örneğini almanız gerekiyorsa hiltViewModel
composable işlevini kullanın ve karşılık gelen backStackEntry
öğesini parametre olarak iletin:
// 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
Çağrı kitaplığı, verileri kademeli olarak yüklemenizi kolaylaştırır ve Compose'da desteklenir.
Çağrı sürüm sayfası, projeye ve sürümüne eklenmesi gereken fazladan paging-compose
bağımlılığı hakkında bilgiler içerir.
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") } } }
Compose'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'ı sunmak için Haritalar Oluşturma 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 = MarkerState(position = singapore), title = "Singapore", snippet = "Marker in Singapore" ) } }
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Compose'da yan etkiler
- State ve Jetpack Compose
- Oluşturma'da kullanıcı arayüzü durumunu kaydet