我正在尝试通过提供者设置TextFormField
的 initialValue 。这有效,但不适用于我的屏幕初始加载。为此,我需要转到上一个屏幕,然后再返回。这是相关的源代码。
用户类别:
class User with ChangeNotifier {
String name;
String email;
User() {
_deserialiseUser();
}
}
void _deserialiseUser() async {
final prefs = await SharedPreferences.getInstance();
final String jsonUser = prefs.getString('user');
if (jsonUser != null) {
var ju = jsonDecode(jsonUser);
name = ju['name'];
email = ju['email'];
notifyListeners();
}
}
主类:
void main() => runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => User()),
...
],
child: MyApp(),
),
);
受影响的屏幕:
class AccountScreen extends StatefulWidget {
@override
_AccountScreenState createState() => _AccountScreenState();
}
class _AccountScreenState extends State<AccountScreen> {
User user;
@override
Widget build(BuildContext context) {
user = context.watch<User>();
return Scaffold(
appBar: AppBar(
title: Text('Account'),
),
body: TextFormField(
initialValue: user.name,
),
);
}
}
如果我将TextFormField
替换为Text
,就可以了。我想念什么?
答案 0 :(得分:0)
编辑:尽管我已经有了答案,但我仍然会接受可以解释问题根本原因的答案。
我通过不像这样延迟加载我的User
提供程序来解决了这个问题:
void main() => runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) => User(),
lazy: false,
),
],
child: MyApp(),
),
);