TextFormField不能反映来自ChangeNotifierProvider的initialValue

时间:2020-10-09 19:36:50

标签: flutter flutter-provider

我正在尝试通过提供者设置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,就可以了。我想念什么?

1 个答案:

答案 0 :(得分:0)

编辑:尽管我已经有了答案,但我仍然会接受可以解释问题根本原因的答案。

我通过不像这样延迟加载我的User提供程序来解决了这个问题:

void main() => runApp(
  MultiProvider(
    providers: [
      ChangeNotifierProvider(
        create: (context) => User(),
        lazy: false,
      ),
    ],
    child: MyApp(),
  ),
);