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:
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ılarına dahil edilenObservable.subscribeAsState()
.
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.
Navigasyon
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" ) } }
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Oluşturma bölümündeki yan etkiler
- State ve Jetpack Compose
- Oluşturma'da kullanıcı arayüzü durumunu kaydet