我创建了一个类来 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
,但也许我遗漏了什么?
1条答案
按热度按时间svgewumm1#
如果我们看看你的流程链,我们有:
字符串
这是一个流,它首先发出
Loading
,然后是NotStarted
(可能不是您想要的),然后是型
它接收排放并用阿波罗Kotlin呼叫代替它们。
(注意:
watch()
永远不会完成。所以你永远不会得到
Loading
或NotStarted
,而只能得到Ready
或Error
。但是你从来没有得到
Ready
也没有Error
-它可能是appSettings.data.last()
块吗?