Flutter: данные синглтона, геттер вызывается при нулевом значении

после того, как я получил данные (пользователя) из HTTP-запроса, я хочу поместить эти данные в синглтон. Затем в другом представлении я хочу показать имя этого пользователя на боковой панели, но там написано: «Получатель 'user' был вызван с нулевым значением». Вот мой код:

var user = await getUser(_username, _password);

      if (user.loginError == false){
        model.user = user;

        Navigator.of(context).pushNamedAndRemoveUntil(
            '/home_view', ModalRoute.withName('/home_view'));
       }

И вот когда я пытаюсь использовать user.name:

Widget hamburgerMenu() {
  Model model;
  return new Drawer(
    child: ListView(
      children: <Widget>[
        new UserAccountsDrawerHeader(
          accountName: Text(model.user.name,
            ...

Вы не должны использовать синглтоны во флаттере. Вместо этого используйте наследуемые виджеты. См. stackoverflow.com/questions/49491860/…

Rémi Rousselet 13.09.2018 20:35

Почему одиночки так плохо переносят флаттер?

Little Monkey 14.09.2018 08:23

Когда их значение изменяется, зависящие от него виджеты не перезагружаются автоматически. Унаследованные виджеты предназначены для решения этой ситуации. По сути, это синглтоны, которые перезагружают зависящие от него виджеты.

Rémi Rousselet 14.09.2018 08:32

О, я вижу. Тогда спасибо, я постараюсь их понять!

Little Monkey 14.09.2018 08:35

Но если я никогда не захочу менять этот элемент, я бы тоже мог использовать синглтон, не так ли?

Little Monkey 14.09.2018 08:36

Не говорю, что нельзя, но это плохая практика. Что, если вы хотите, например, справиться с отключением или переименованием пользователя?

Rémi Rousselet 14.09.2018 08:57
0
6
549
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В hamburgerMenu() вы объявляете Model model;, но никогда не присваиваете ему никакой ценности. Он всегда будет нулевым. Если это синглтон, вам нужно сделать что-то вроде этого

Widget hamburgerMenu() {
  Model model = Model.instance;//You fetch the instance of the singleton
  return new Drawer(
    child: ListView(
      children: <Widget>[
        new UserAccountsDrawerHeader(
          accountName: Text(model.user.name,
            ...

Кроме того, не делайте этого внутри функции сборки. Если это виджет с отслеживанием состояния, сделайте это в функции initState()

ооо да, не заметил своей ошибки. Большое спасибо!

Little Monkey 14.09.2018 08:22

Другие вопросы по теме