Не знаю, где я получаю NoSuchMethodError: '[]'.

Я делаю демо приложение для входа в систему, используя python framework-django, graphql, flutter, как показано ниже. enter image description here

Это очень простое приложение для теста, но я получаю "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"]));
Вернуться на верх