【问题标题】:TextFormField does not reflect initialValue from a ChangeNotifierProviderTextFormField 不反映来自 ChangeNotifierProvider 的 initialValue
【发布时间】:2020-10-09 19:36:50
【问题描述】:

我正在尝试从我的提供商处设置我的TextFormFieldinitialValue。这有效,但不适用于我的屏幕的初始加载。为此,我需要转到上一个屏幕,然后返回。以下是相关的源代码。

用户类别:

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,
      ),
    );
  }
}

如果我用Text 替换我的TextFormField,这工作正常。我错过了什么?

【问题讨论】:

  • 你用的是模型???
  • User 类是我的模型。

标签: flutter flutter-provider


【解决方案1】:

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

我没有像这样懒惰地加载我的User 提供程序,从而解决了这个问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2022-09-30
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多