小编bei*_*rad的帖子

在 Kotlin 的 Stateflow 上使用映射

通过 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)

android viewmodel kotlin android-livedata kotlin-stateflow

18
推荐指数
1
解决办法
1万
查看次数

如何在jetpack中添加ImageSpan撰写文本

我们知道, JetpackCompose 中的AnnotatedString提供了Android 的 SpannedString的一些 API 。

但我没有找到任何方法/解决方法将ImageSpan内联到文本(使用 AndroidView 除外)

android spannablestring spannable android-jetpack-compose android-jetpack-compose-text

11
推荐指数
1
解决办法
8912
查看次数

net::ERR_ACCESS_DENIED 在 Android Activity 中打开网页时出现 Android 错误

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

在此处输入图片说明

android android-webview

9
推荐指数
3
解决办法
2万
查看次数

填充并发出 StateFlow 列表

我想使用 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 的情况下实现这一目标?

感谢您

android kotlin kotlin-stateflow

9
推荐指数
1
解决办法
7917
查看次数

将 Jetpack-Compose 添加到使用低于 21 的 API 的项目

我知道在项目中启用 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

8
推荐指数
1
解决办法
7515
查看次数

使用导航图范围注入视图模型:NavController 在 onCreate() 之前不可用

我在我的应用程序中使用导航组件,并在同一图中的多个片段之间使用共享 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

7
推荐指数
1
解决办法
3543
查看次数

安卓 | 科特林 | Flow - 无法转换为 kotlinx.coroutines.flow.StateFlow

我试图让自己熟悉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

6
推荐指数
1
解决办法
9745
查看次数

LiveData 转换为 StateFlow / SharedFlow

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

5
推荐指数
1
解决办法
2601
查看次数

android协程流程手动重试

我在 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 …

android kotlin-coroutines kotlin-flow

5
推荐指数
1
解决办法
2238
查看次数

使用不同版本的 Compose 和 ComposeCompiler

根据 Compose to Kotlin Compatibility Map,ComposeCompiler 必须兼容 Kotlin 版本。

Compose 和 ComposeCompiler 之间是否存在这种兼容性关系?

哪一个应该更新一些?

我没有找到任何文档/参考来描述这种关系。

android kotlin android-jetpack-compose

5
推荐指数
1
解决办法
763
查看次数