我正在重构应用以使用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吗?
我一直在努力寻找解决方案,但不知道为什么。
答案 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}');
});
}
}