Не знаю, где я получаю NoSuchMethodError: '[]'.
Я делаю демо приложение для входа в систему, используя python framework-django, graphql, flutter, как показано ниже.
Это очень простое приложение для теста, но я получаю "NoSuchMethodError='[]'", и я уже потратил несколько часов на эту проблему.
Ниже приведены сообщения об ошибках, которые я получаю.
The user wants to create an account with dsafds@asdfasd.com and dasdfadsf dart_sdk.js:28087
There was an error!
Uncaught (in promise) Error: NoSuchMethodError: '[]'
Dynamic call of null.
Receiver: null
Arguments: [0]
at Object.throw_ [as throw] (:58141/dart_sdk.js:5348)
at Object.defaultNoSuchMethod (:58141/dart_sdk.js:5793)
at Object.noSuchMethod (:58141/dart_sdk.js:5788)
at callNSM (:58141/dart_sdk.js:5521)
at Object._checkAndCall (:58141/dart_sdk.js:5523)
at Object.callMethod (:58141/dart_sdk.js:5601)
at Object.dsend (:58141/dart_sdk.js:5604)
at main._LoginPageState.new._createAccountPressed (:58141/packages/auth_frontend/main.dart.lib.js:1003)
at _createAccountPressed.next (<anonymous>)
at :58141/dart_sdk.js:39230
at _RootZone.runUnary (:58141/dart_sdk.js:39087)
at _FutureListener.thenAwait.handleValue (:58141/dart_sdk.js:34073)
at handleValueCallback (:58141/dart_sdk.js:34633)
at Function._propagateToListeners (:58141/dart_sdk.js:34671)
at _Future.new.[_completeWithValue] (:58141/dart_sdk.js:34513)
at async._AsyncCallbackEntry.new.callback (:58141/dart_sdk.js:34536)
at Object._microtaskLoop (:58141/dart_sdk.js:39374)
at _startMicrotaskLoop (:58141/dart_sdk.js:39380)
at :58141/dart_sdk.js:34887
Результат работы врача-флюоролога ниже
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 2.2.3, on Microsoft Windows [Version 10.0.19043.1165], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
[√] Chrome - develop for the web
[√] Android Studio (version 4.1.0)
[√] VS Code (version 1.60.0)
[√] Connected device (2 available)
• No issues found!
Ниже приведен код моего проекта flutter (я исключил несущественные строки) <main.dart>
<graphql_config.dart>
import "package:flutter/material.dart";
// ignore: import_of_legacy_library_into_null_safe
import 'package:graphql_flutter/graphql_flutter.dart';
// ignore: import_of_legacy_library_into_null_safe
import 'package:shared_preferences/shared_preferences.dart';
class GraphQLConfiguration {
static final HttpLink httpLink = HttpLink(
uri: "http://127.0.0.1:8000/graphql",
);
static final AuthLink authLink = AuthLink(getToken: () async {
SharedPreferences pref = await SharedPreferences.getInstance();
return pref.getString("token");
});
static final Link link = authLink.concat(httpLink);
static ValueNotifier<GraphQLClient> initializeClient() {
ValueNotifier<GraphQLClient> client = ValueNotifier(
GraphQLClient(
link: link,
cache: OptimisticCache(dataIdFromObject: typenameDataIdFromObject),
),
);
return client;
}
GraphQLClient clientToQuery() {
return GraphQLClient(
link: link,
cache: OptimisticCache(dataIdFromObject: typenameDataIdFromObject),
);
}
}
<graphql_query.dart>
class QueryMutation {
String register(String email, String user, String password) {
return """
mutation {
register(
email: "$email",
username: "$user",
password1: "$password",
password2: "$password",
) {
success,
errors,
token,
refreshToken
}
}
""";
}
}
<settings.py - django>
"""
Generated by 'django-admin startproject' using Django 3.2.7.
...
"""
from pathlib import Path
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users',
'graphene_django',
'graphql_jwt.refresh_token.apps.RefreshTokenConfig',
"graphql_auth",
'django_filters',
'corsheaders',
]
AUTH_USER_MODEL = 'users.CustomUser'
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
CORS_ORIGIN_ALLOW_ALL = True
GRAPHENE = {
'SCHEMA': 'auth2.schema.schema', # this file doesn't exist yet
'MIDDLEWARE': [
'graphql_jwt.middleware.JSONWebTokenMiddleware',
],
}
GRAPHQL_JWT = {
"JWT_VERIFY_EXPIRATION": True,
# optional
"JWT_LONG_RUNNING_REFRESH_TOKEN": True,
"JWT_ALLOW_ANY_CLASSES": [
"graphql_auth.mutations.Register",
],
}
AUTHENTICATION_BACKENDS = [
# 'graphql_jwt.backends.JSONWebTokenBackend',
'django.contrib.auth.backends.ModelBackend',
"graphql_auth.backends.GraphQLAuthBackend",
]
EMAIL_BACKEND ='django.core.mail.backends.console.EmailBackend'
ROOT_URLCONF = 'auth2.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'auth2.wsgi.application'
DATABASES = {
'default': {
...
}
}
AUTH_PASSWORD_VALIDATORS = [
...
]
...
Я предполагаю, что с async/await что-то не так, но я не слишком уверен в этом. Я пробовал несколько способов, но кажется, что все становится еще сложнее.
Любой совет будет высоко оценен!
Я считаю, что вы допустили опечатку в файле main.dart здесь:
if (result.data["success"] != null) {
...
}
должно быть success, а не sucess.
Кроме того, для доступа к картам следует помнить об использовании круглых скобок, когда это необходимо:
print((((((result.data["register"])["errors"])["email"])[0])["message"]));