ScopedModelDescendant字符串返回null。未检索状态

时间:2019-01-11 18:59:15

标签: dart flutter state state-management

我正在重构应用以使用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();
}
}

两个print语句均返回正确的名称。

但是当我尝试在另一页ScopedModelDescendant中使用name进行呼叫时,返回null:

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

  return ScopedModelDescendant<UserModel>(

    builder: (context, child, model) =>

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

    );

  }
}

Text('${model.name}'),返回null

有人知道为什么name返回null吗? 我一直在努力寻找解决方案,但不知道为什么。

1 个答案:

答案 0 :(得分:0)

似乎有两个问题:

1.-当方法不是静态的时,您正在以静态方式调用.initialiseValues()。然后,您将在UserModel内创建一个新的ScopedModel

2.-您正在第一个async方法内调用build()函数,但不确定何时结束,UserModel可能在以下时间未完全初始化建造树。

您可能应该有一个布尔变量(或检查.name是否为空),并在初始化时将其设置为true。

在build方法中,如果该变量为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}');
    });
  }
}