首页 > 解决方案 > Flutter graphql查询,变量不会更新,不发送最新查询

问题描述

我设置了以下变量。registerUser 是 graphQL api 调用。我希望 $name、$password、$premium 和 $email 是在按下按钮时确定的动态变量(注册)。这段代码都在一个有状态的小部件中。

    String name;
    String password = "";
    bool premium = false;
    String email = "dasa";
    String registerUser = '''
    mutation {
      addUserManual(name:"$name",password:"$password",premium:$premium,email:"$email"){
      userid
      }
    }
'''

然后我像这样为每个 graphql_flutter 插件定义一个突变。在 runmutation({.. 发送到服务器的突变是上面初始定义变量的突变,它不发送最近的查询。有谁知道如何从字段更新 vvalue,然后将其插入查询中?。

child: Mutation(options: MutationOptions(
                  documentNode: gql(registerUser),
                  update: (Cache cache, QueryResult result) {
                    return cache;
                  },
                  // or do something with the result.data on completion
                  onCompleted: (dynamic resultData) {
                    print(resultData);
                  },
                ), builder: (RunMutation runMutation, QueryResult result){
                  return RaisedButton(
                    elevation: 5,
                    onPressed: () {
                      //FIX LATER
                      print(result.data);
                      runMutation({'name':"hi",'password':"test",'premium':false,'email':"blabla"});
                    },
                    child: Text('SIGN UP'),
                    color: Colors.white,
                    shape: RoundedRectangleBorder(borderRadius: new BorderRadius.circular(30.0)),
                  );
                })

标签: fluttergraphqlmobile-development

解决方案


主要问题是您将 dart 变量与 GraphQL 变量混为一谈。GraphQL 是它自己的语言,graphql-flutter不能将变量传递给 GraphQL,除非它们被定义为突变的参数,如下所示:

String registerUser = r'''
  mutation RegisterUser($name: String!, email: String!, $password: String!, $premium: Boolean = false){
    addUserManual(name: $name, password: $password, premium: $premium, email: $email){
      userid
    }
  }
''';

这将使用输入变量参数化突变,并使用标签转义字符串r以防止插值。您在dartpad中运行的原始代码产生

mutation {
  addUserManual(name:"null",password:"",premium:false,email:"dasa"){
    userid
  }
}

这是一个带有硬编码变量的静态mutation变量。


推荐阅读