Kotlin流似乎没有从Composable收集

iyfjxgzm  于 12个月前  发布在  Kotlin
关注(0)|答案(1)|浏览(134)

我创建了一个类来 Package KotlinGraphQL查询:

class GraphQuery<DataType : Query.Data>(
    private val api: Api,
    private val queryFactory: suspend () -> Query<DataType>,
) {

    private val control: MutableStateFlow<GraphQueryState<DataType>> = MutableStateFlow(GraphQueryState.NotStarted())

    public val flow = control
        .onStart { emit(GraphQueryState.Loading()) }
        .flatMapConcat {

            api.client
                .query(queryFactory())
                .fetchPolicy(FetchPolicy.NetworkOnly)
                .watch()
                .map { response ->
                    when (response.hasErrors()) {
                        true -> GraphQueryState.Error(response.errors!!)
                        else -> GraphQueryState.Ready(response.data!!)
                    }
                }
        }

    public fun update(data: DataType) {
        control.value = GraphQueryState.Updating(data)
    }

    public fun refresh() {
        control.value = GraphQueryState.Loading()
    }
}

字符串
一般的意图是减少样板代码,并给予我的应用程序一种一致的方法来检索数据。
我通过ViewModel使用了这个类的示例:

@HiltViewModel
class EditWebPaymentSettingsViewModel @Inject constructor (
    appSettings: DataStore<Settings>,
    api: Api,
) : ViewModel() {

    private val settingsQuery = GraphQuery(api) {

        val settings = appSettings.data.last()

        SettingsForAdminQuery(
            UUID.fromString(settings.currentOrganizationId),
            SupportedSettingPurpose.WebPayment.value,
        )
    }

    public val settings = settingsQuery.flow
}


然后由应用程序中的Composable使用:

@Composable
fun EditWebPaymentSettingsScreen(
    done: () -> Unit,
    viewModel: EditWebPaymentSettingsViewModel = hiltViewModel()
) {

    val webPaymentSettings by viewModel.settings.collectAsStateWithLifecycle(GraphQueryState.NotStarted())

    when (webPaymentSettings) {

        is GraphQueryState.Loading,
        is GraphQueryState.NotStarted -> Loading()

        is GraphQueryState.Ready,
        is GraphQueryState.Updating -> TODO()

        is GraphQueryState.Error -> TODO()
    }
}


我的问题是,我从来没有到达任何TODO()块。我的webPaymentSettings无限期地保持初始值NotStarted,我的查询从来没有运行过。
有什么简单的方法可以解释为什么我的查询从来没有运行过吗?我的工具类执行了一个flatMapConcat,这让我认为查询应该在第一个值之后发出。我的印象是这是一个 * 热 * 流,因为我使用的是MutableStateFlow,但也许我遗漏了什么?

svgewumm

svgewumm1#

如果我们看看你的流程链,我们有:

control
        .onStart { emit(GraphQueryState.Loading()) }

字符串
这是一个流,它首先发出Loading,然后是NotStarted(可能不是您想要的),然后是

.flatMapConcat {
  <Apollo Kotlin watch>
}


它接收排放并用阿波罗Kotlin呼叫代替它们。
(注意:watch()永远不会完成。
所以你永远不会得到LoadingNotStarted,而只能得到ReadyError
但是你从来没有得到Ready也没有Error-它可能是appSettings.data.last()块吗?

相关问题