Flutter中如何向GraphQL包的QueryOptions的变量参数传递布尔表达式
在Flutter中给GraphQL QueryOptions传递布尔过滤条件的正确方式
我来帮你解决这个问题!你当前的代码存在语法和逻辑上的小问题,我们一步步修正它,实现你想要的动态布尔过滤效果。
首先分析你代码里的问题
你想要根据isAvailable的值动态生成GraphQL查询的过滤变量,但现有写法有两个明显问题:
{false}不是有效的Dart Map结构——Map必须是键值对形式,不能直接放单个布尔值is_available作为Map的键,在Dart里必须用字符串包裹(否则会被当作未定义的变量,引发编译错误)
正确的实现方案
假设你的后端GraphQL schema定义的过滤条件是类似is_available: { _eq: 布尔值 }的结构(这是Hasura等GraphQL服务常用的过滤格式),我们可以根据你的业务需求提供两种实现方式:
方案1:根据isAvailable动态匹配对应布尔值
如果你需要当isAvailable为true时查询is_available=true的条目,为false时查询is_available=false的条目,可以直接把变量值和Dart的布尔值绑定:
Future<QueryResult> FilteredQuery( final GraphQLClient client, final FilterModel filter, final bool isAvailable, ) async { final QueryOptions options = QueryOptions( document: gql(queryCreationsFiltered), variables: <String, dynamic>{ 'condition1': { 'is_available': {'_eq': isAvailable} } }, ); final QueryResult result = await client.query(options); return result; }
方案2:仅在特定条件下添加过滤规则
如果你需要当isAvailable为true时才过滤is_available=true的条目,为false时返回所有数据,可以用Dart的条件Map语法实现:
Future<QueryResult> FilteredQuery( final GraphQLClient client, final FilterModel filter, final bool isAvailable, ) async { final Map<String, dynamic> variables = {}; // 仅当isAvailable为true时,添加过滤条件 if (isAvailable) { variables['condition1'] = { 'is_available': {'_eq': true} }; } final QueryOptions options = QueryOptions( document: gql(queryCreationsFiltered), variables: variables, ); final QueryResult result = await client.query(options); return result; }
额外注意事项
- 请确保你的GraphQL查询文档(
queryCreationsFiltered)中,condition1变量的类型和你传递的嵌套Map结构完全匹配,比如对应的GraphQL输入类型应该定义了is_available字段及其子字段_eq - 如果你的后端支持
null表示忽略该过滤条件,也可以用三元运算符简化:'condition1': isAvailable ? {'is_available': {'_eq': true}} : null
内容的提问来源于stack exchange,提问作者Louis fabiare
相关产品推荐
相关产品推荐

