我在我的 flutter 应用程序中使用graphql_flutter包进行 GraphQL 操作。查询和突变进展顺利,但我无法按照文档中提到的方式检索错误。每次我收到一条通用错误消息时,
ClientException: Failed to connect to http://127.0.0.1:3006/graphql:
Run Code Online (Sandbox Code Playgroud)
我通过做得到的,
print(result.exception.toString());
Run Code Online (Sandbox Code Playgroud)
我的突变看起来像,
final MutationOptions mutationOptions = MutationOptions(
documentNode: gql(mutationString),
variables: vars
);
final QueryResult result = await _instance._client.mutate(mutationOptions);
if (result.hasException) {
// none of the following prints the expected error.
print(result.exception.clientException.message);
print(result.exception.graphqlErrors);
print(result.exception.toString());
}
print(result.data);
return result.data;
Run Code Online (Sandbox Code Playgroud)
而在 apollo 客户端中,我的错误是:
{
"errors": [
{
"message": "Invalid Phone number provided",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"otp"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
.... …Run Code Online (Sandbox Code Playgroud) 我在使用 graphql_flutter 包的 mutate 方法时收到此错误。
尝试使用以下版本的qraphql_flutter包:
错误:
I/flutter (13946): //// EXCEPTION: OperationException(linkException: ResponseFormatException(originalException: FormatException: Unexpected character (at character 1)
I/flutter (13946): <!DOCTYPE html>
I/flutter (13946): ^
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="refresh" content="0;url='https://xxx.xxx.dev/login'" />
<title>Redirecting to https://xxx.xxx.dev/login</title>
</head>
<body>
Redirecting to <a href="https://xxx.xxx.dev/login">https://xxx.xxx.dev/login</a>.
</body>
</html>
I/flutter (13946): ), graphqlErrors: [])
Run Code Online (Sandbox Code Playgroud)
我尝试使用相同的代码运行查询。此代码与查询完美配合,仅在使用突变时引发异常。我创建了一个 graphql 帮助器类,它可以帮助使用此帮助器类执行项目中的每个 graphql 操作。
GraphQL 助手类:
import 'package:flutter/foundation.dart';
import 'package:graphql_demo/app_exception.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
class AppGraphQlClient {
late GraphQLClient _client;
AppGraphQlClient(String graphqlUrl) {
final httpLink …Run Code Online (Sandbox Code Playgroud) 我正在使用 Flutter graphql_client ,它的实现与本示例中的差不多
我的客户端创建如下所示:
abstract class AbstractAdapter {
Link get httpLink;
GraphQLClient client;
AbstractAdapter() {
client = GraphQLClient(cache: InMemoryCache(), link: httpLink);
}
Future<QueryResult> query(QueryOptions options) {
return client.query(options);
}
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但问题在于缓存如果我发送相同的突变两次,它会返回缓存的结果而不是再次发送!
感谢任何帮助。
我正在使用flutter_graphql并不断收到异常OperationException(linkException: ResponseFormatException(originalException: FormatException: Unexpected end of input (at character 1), )^ graphqlErrors: []),
有没有办法显示实际发送的请求?想要在控制台中查看实际通过的请求
客户
class GraphqlClient {
static String _token;
static final String serverUrl =
GlobalConfiguration().getString(Config.GRAPHQL_URL);
static final HttpLink httpLink = HttpLink(
serverUrl,
);
static final AuthLink authLink = AuthLink(getToken: () async {
final SharedPrefsRepository _sharedPrefsRepository =
SharedPrefsRepository();
String accountKey = await _sharedPrefsRepository.getAccountKey();
String sessionKey= await _sharedPrefsRepository.getSessionKey();
_token = 'Bearer $accountKey, Bearer $sessionKey';
debugPrint('token '+_token);
return _token ?? '';
});
static final Link link = authLink.concat(httpLink); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 GraphQL 为 flutter 应用程序创建小部件测试。我想做的是测试应用程序的行为,该行为取决于用户操作的 GraphQL 突变的结果。
这是该应用程序的一个非常简单的示例:
class FirstScreen extends StatelessWidget {
@override
Widget return Container(
child: Mutation(
options: myMutationOptions,
onCompleted: (dynamic result) {
final bool myBool = result['bool'] as bool;
if (myBool) {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => SecondScreen()));
} else {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => ThirdScreen()));
}
},
builder: (RunMutation runMutation, QueryResult queryResult) {
return FlatButton(
child: Text('Button'),
onPressed: () async {
await runMutation(myParameters).networkResult;
},
);
},
),
);
}
Run Code Online (Sandbox Code Playgroud)
我想做的是模拟突变的结果,因此在我的小部件测试中,我可以测试按钮是否重定向到SecondScreen或ThirdScreen取决于结果myBool。
我怎样才能做到这一点 ?