TextFormField 不反映来自 ChangeNotifierProvider 的 initialValue
TextFormField does not reflect initialValue from a ChangeNotifierProvider
我正在尝试从我的供应商处设置 TextFormField
的 initialValue。这有效但不适用于我屏幕的初始负载。为此,我需要转到上一个屏幕,然后返回。下面是相关的源代码。
用户class:
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();
}
}
主要class:
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
,则效果很好。我错过了什么?
编辑:虽然我已经有了答案,但我仍然会接受能够解释问题根本原因的答案。
我通过不像这样延迟加载我的 User
提供商解决了这个问题:
void main() => runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) => User(),
lazy: false,
),
],
child: MyApp(),
),
);
我正在尝试从我的供应商处设置 TextFormField
的 initialValue。这有效但不适用于我屏幕的初始负载。为此,我需要转到上一个屏幕,然后返回。下面是相关的源代码。
用户class:
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();
}
}
主要class:
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
,则效果很好。我错过了什么?
编辑:虽然我已经有了答案,但我仍然会接受能够解释问题根本原因的答案。
我通过不像这样延迟加载我的 User
提供商解决了这个问题:
void main() => runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) => User(),
lazy: false,
),
],
child: MyApp(),
),
);