ScopedModelDescendant String возвращает значение NULL. Не восстанавливается состояние - PullRequest
0 голосов
/ 11 января 2019

Я использую приложение для рефакторинга scoped_model, но у меня есть проблема. Состояние, кажется, не проходит правильно между виджетом.

Я начинаю с добавления ScopedModel к вершине дерева виджетов при запуске.

 @override
  Widget build(BuildContext context) {

    UserModel().initialiseValues();

    return ScopedModel<UserModel>(
      model: UserModel(),

    child: MaterialApp(
        home: new Page(),
    ),
    );
  }

Этот вызов .initialiseValues();, поэтому модель читает из SharedPreferences и сохраняет в переменных:

class UserModel extends Model {

  String _name;
  String get name => _name;

void initialiseValues() async {
    SharedPreferences sharedPrefs = await SharedPreferences.getInstance();

_name = sharedPrefs.getString('name');
print(‘_name from sharedPrefs is $_name');
print(‘name from sharedPrefs is $name');


notifyListeners();
}
}

Оба оператора печати возвращают правильное имя.

Но когда я пытаюсь позвонить, используя ScopedModelDescendant на другой странице, name возвращает ноль:

class PageFive extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

  return ScopedModelDescendant<UserModel>(

    builder: (context, child, model) =>

Text('${model.name}'),

    );

  }
}

Text('${model.name}'), возврат null

Кто-нибудь знает, почему name возвращает ноль? Я выгляжу трудно решить, но понятия не имею, почему.

1 Ответ

0 голосов
/ 12 января 2019

Кажется, есть две проблемы:

1.- Вы вызываете .initialiseValues() статическим способом, когда метод не является статическим. И тогда вы создаете новый UserModel внутри ScopedModel.

2.- Вы вызываете функцию async внутри первого build() метода, но не уверены, когда он завершится, и, возможно, UserModel не полностью инициализируется при построении дерева.

Возможно, вы должны иметь логическую переменную (или проверить .name на ноль) и установить ее в значение true при инициализации.

В методе сборки, если эта переменная равна false, вы можете вернуть CircularProgressIndicator, а когда true, просто вернуть свой виджет.

@override
Widget build(BuildContext context) {

  var userModel = UserModel()..initialiseValues();

  return ScopedModel<UserModel>(
    model: userModel,
    child: MaterialApp(
      home: new Page(),
    ),
  );
}

class PageFive extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
  return ScopedModelDescendant<UserModel>(
    builder: (context, child, model) {
       if (model.name == null)
          return CircularProgressIndicator();
       else
          return Text('${model.name}');
    });
  }
}
...