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:
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 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.
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, 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.@HiltViewModel
ViewModel
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" ) } }
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