NoSuchMethodError: «Фамилия» получателя была вызвана на нуль - PullRequest
0 голосов
/ 02 апреля 2019

Я запускаю login процесс с пользовательским BaaS. Кнопка отправки запускает метод onPressed, который проверяет Response response; if reponse.statusCode == 200, а затем отправляет fromJson(reponse.data).surname и fromJson(response.data).firstname на Homepage экран. Я настроил переход на экран Homepage, и он работает, но когда я пытаюсь Hot Reload приложение, затем пытаюсь получить доступ к домашней странице, оно выдает NoSuchMethodError I/flutter (14935): The getter 'surname' was called on null. Как мне решить эту проблему?

Я попытался присвоить widget.data.surname случайному string в initState, он устраняет ошибку, но не переназначает widget.data.surname и widget.data.firstname на fromJson(reponse.data).surname и fromJson(response.data).firstname

class Data
{
  String surname = '';
  String firstname= '';

  Data ({this.surname, this.firstname});
}
Response response;
          Dio dio = new Dio();
          response = await dio.get(findUrl, queryParameters: {"username": _username, "password": _password});
          print(response.statusCode);

          if(response.statusCode == 200){
            print(UsersInfo.fromJson(response.data).surname);

            userSurname = UsersInfo.fromJson(response.data).surname;

            userFirstname = UsersInfo.fromJson(response.data).firstname;

            var data = Data (
              surname: userSurname,
              firstname: userFirstname
            );

            Fluttertoast.showToast(
                msg: "Login successful",
                toastLength: Toast.LENGTH_LONG,
                gravity: ToastGravity.BOTTOM,
                timeInSecForIos: 6,
                backgroundColor: Colors.black,
                textColor: Colors.white,
                fontSize: 16.0
            );

            Future.delayed (Duration(seconds: 7),
                    () async {
                  Navigator.push(context,
                      MaterialPageRoute(builder: (context) => HomePage(data: data))
                  );
                  print('7 seconds');
                }
            );
          }

Второй экран (домашняя страница)

Data data;

  HomePage ({this.data});
enum AuthStatus {
  notSignedIn,
  signedIn
}
AuthStatus _authStatus = AuthStatus.notSignedIn;

  @override
  initState() {
    super.initState();
    setState(() {
      widget.data = Data (surname: '', firstname: '');
       _authStatus = ((widget.data.surname == '')) ? AuthStatus.notSignedIn : AuthStatus.signedIn;
    });
  }

1 Ответ

0 голосов
/ 02 апреля 2019

Данные в виджете являются окончательными.Держите одну версию в состоянии, если вы измените ее там.А затем в initState сделать:

_data = widget.data ?? Data();

Редактировать: я пропустил важную заметку.Не вызывайте setState в initState, он еще не собран, и любые данные, которые вы установили там, будут там при первом рисовании.

И измените класс данных, чтобы он имел параметры по умолчанию:

class Data{
  final String surname;
  final String firstname;

  Data ({this.surname = '', this.firstname = ''});
}

Или вы можете даже добавить фабрику, которая извлекает из объекта UsersInfo:

Data.fromUsersInfo(UsersInfo info) : firstname = info.firstname, surname = info.surname;

Затем в методе onPressed вы можете создавать данные просто с помощью:

var data = Data.fromUsersInfo(UsersInfo.fromJson(response.data));

Я не уверен, что ещевы делаете с этими данными, но это должно работать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...