通过 Viewmodel 中的 LiveData,我们可以像这样使用 switchMap 或 Transformations.map
val recipesList = cuisineType.switchMap { repository.getDisplayRecipes(it.cuisineType).asLiveData() }
Run Code Online (Sandbox Code Playgroud)
使用 StateFlow 实现此目的的最佳方法是什么?我知道我们可以像下面一样使用地图,但是这会返回 Flow<Flow<List<Recipe>>> ,这似乎不正确
val recipeListFlow = cuisineTypeStateFlow.map {
repository.getDisplayRecipes(it.cuisineType)
}
Run Code Online (Sandbox Code Playgroud) 我们知道, JetpackCompose 中的AnnotatedString提供了Android 的 SpannedString的一些 API 。
但我没有找到任何方法/解决方法将ImageSpan内联到文本(使用 AndroidView 除外)
android spannablestring spannable android-jetpack-compose android-jetpack-compose-text
Android 网页显示 net::ERR_ACCESS_DENIED,同时打开嵌入有网页标签的 Android 活动
我试图在 Android Manifest 中提供权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)
网络视图:
WebView webView;
webView = (WebView)findViewById(R.id.webbrowser);
webView.setWebViewClient(new WebViewClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.loadUrl("http://basic-testing-faq.blogspot.com/");
Run Code Online (Sandbox Code Playgroud)
我得到 net::ERR_ACCESS_DENIED

我想使用 StateFlow。但目前,我找不到任何可以帮助我的讲座。
我面临一个问题:首先,我有一个包含字符串列表的单例,我想要一些“容易”理解的东西,即使它不是现在的目标目的。目的是用字符串填充并发出列表(稍后它将是一个复杂的对象)。
class CustomStateFlow() {
private val _custom = MutableStateFlow(emptyList<String>())
val custom: StateFlow<List<String>> = _custom
fun addString(string: String) {
val tempList = _custom.value.toMutableList()
tempList.add(string)
_custom.value = tempList
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我不喜欢临时列表...没有,我无法触发片段中自定义的“收集”。
有没有办法在不使用 tempList 的情况下实现这一目标?
感谢您
我知道在项目中启用 Jetpack Compose 必须达到最低 API 级别 21。
我想在现有项目中使用 JetPack Compose。它使用minSdkVersion=17但我无法将 compose 依赖项添加到build.gradle.
uses-sdk:minSdkVersion 17 cannot be smaller than version 21 declared in library [androidx.activity:activity-compose:1.3.0-alpha03]
Run Code Online (Sandbox Code Playgroud)
我的目标是为 Android API >= 21 的用户使用 Compose。
android android-manifest android-jetpack android-jetpack-compose
我在我的应用程序中使用导航组件,并在同一图中的多个片段之间使用共享 ViewModel。现在我想用这个图形范围实例化视图模型此。
如您所知,我们应该onAttach在片段中注入对象(ViewModel、..etc):
但是当我想这样做(在 中注入具有图形范围的 ViewModel onAttach)时,会发生此错误:
IllegalStateException: NavController is not available before onCreate()
Run Code Online (Sandbox Code Playgroud)
你知道我怎么做吗?
android fragment-lifecycle dagger-2 android-viewmodel android-architecture-navigation
我试图让自己熟悉DataStore,所以在我当前的项目中,我尝试使用它。
在我的依赖中。我已经添加 :
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha06"
Run Code Online (Sandbox Code Playgroud)
然后我创建了这个类来处理数据存储:
class BasicDataStore(context: Context) :
PrefsDataStore(
context,
PREF_FILE_BASIC
),
BasicImpl {
override val serviceRunning: Flow<Boolean>
get() = dataStore.data.map { preferences ->
preferences[SERVICE_RUNNING_KEY] ?: false
}
override suspend fun setServiceRunningToStore(serviceRunning: Boolean) {
dataStore.edit { preferences ->
preferences[SERVICE_RUNNING_KEY] = serviceRunning
}
}
companion object {
private const val PREF_FILE_BASIC = "basic_preference"
private val SERVICE_RUNNING_KEY = booleanPreferencesKey("service_running")
}
}
@Singleton
interface BasicImpl {
val serviceRunning: Flow<Boolean>
suspend fun setServiceRunningToStore(serviceRunning: Boolean)
}
Run Code Online (Sandbox Code Playgroud)
在我的视图模型中,我尝试使用该值,如下所示:
class MainViewModel(application: Application) : …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-architecture-components kotlin-coroutines android-jetpack-datastore
StateFlow / SharedFlow 中此实时数据转换的等效代码是什么?
val myLiveData: LiveData<MyLiveData> = Transformations
.switchMap(_query) {
if (it == null) {
AbsentLiveData.create()
} else {
repository.load()
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想监听每个查询更改以对返回的内容做出反应。因此,任何类似于使用 StateFlow / SharedFlow 的东西都是受欢迎的。
kotlin android-livedata kotlin-flow kotlin-stateflow kotlin-sharedflow
我在 viewModel 中使用 stateFlow 来获取带有密封类的 api 调用的结果,如下所示:
sealed class Resource<out T> {
data class Loading<T>(val data: T?): Resource<T>()
data class Success<T>(val data: T?): Resource<T>()
data class Error<T>(val error: Exception, val data: T?, val time: Long = System.currentTimeMillis()): Resource<Nothing>()
}
Run Code Online (Sandbox Code Playgroud)
class VehicleViewModel @ViewModelInject constructor(application: Application, private val vehicleRepository: VehicleRepository): BaseViewModel(application) {
val vehiclesResource: StateFlow<Resource<List<Vehicle>>> = vehicleRepository.getVehicles().shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)
}
Run Code Online (Sandbox Code Playgroud)
我想在我的 UI 中建议一个按钮,以便如果 api 调用失败,用户可以重试调用。我知道流程上有一个retry方法,但无法手动调用它,因为它仅在发生异常时触发。
一个常见的用例是:用户没有互联网连接,当 api 调用返回网络异常时,我向用户显示一条消息,告诉他检查其连接,然后使用重试按钮(或通过检测设备现在已连接,无论如何),我重试该流程。
但我想不出一种方法来做到这一点,就像你不能那样,比如 call flow.retry()。retry一旦发生异常,就会调用实际的方法。我不想在不要求用户检查其连接的情况下立即重试,这没有意义。
实际上,我发现的唯一解决方案是在按下重试按钮时重新创建活动,以便重置流程,但这当然对性能来说很糟糕。
如果没有流程,解决方案很简单,并且有大量示例,您只需重新启动作业即可,但我找不到一种方法来正确使用流程。我的存储库中有本地房间数据库和远程服务之间的逻辑,并且 flow api …
根据 Compose to Kotlin Compatibility Map,ComposeCompiler 必须兼容 Kotlin 版本。
Compose 和 ComposeCompiler 之间是否存在这种兼容性关系?
哪一个应该更新一些?
我没有找到任何文档/参考来描述这种关系。
android ×9
kotlin ×4
kotlin-flow ×2
android-architecture-components ×1
android-architecture-navigation ×1
android-jetpack-compose-text ×1
dagger-2 ×1
spannable ×1
viewmodel ×1