在颤抖中访问上下文

时间:2020-06-03 09:59:12

标签: flutter

我有一个带有表单的屏幕,其中显示了县的下拉列表。 屏幕最初加载时,我想将默认设置为当前国家/地区。

class _SignInScreenState extends State<SignInScreen> {
  final formKey = new GlobalKey<FormState>();

  String countryCode = _CountryCode();

  _countryCode() {
    Locale myLocale = Localizations.localeOf(context);
    return myLocale.countryCode;
  }

  @override
  Widget build(BuildContext context) {...

这将导致以下错误:“只能在初始化程序中访问静态成员”。我对此进行了研究,并指出解决方案是在initState()中初始化变量,如下所示:

  @override
  initState() {
    super.initState();
    countryCode = _countryCode();
  }

这不会产生错误,但是在小部件树中countryCode的值为null,而在小部件树中_countryCode()正确显示“ US”。

如果我在初始化状态下设置countryCode的值,这是否意味着每次重新绘制小部件树时都将其重置?

1 个答案:

答案 0 :(得分:0)

initState的主要目的是初始化变量,并且仅在销毁小部件时才会调用它,因此只要不调用小部件的dispose方法,通过initState初始化的变量就可以存在,您可以在构建方法中使用它。

关于构建方法,因此,每当您在窗口小部件中更改某些内容时,Flutter都会调用构建方法并通过其返回的内容重新渲染该窗口小部件,而与initState无关。这实际上称为“热加载”。希望这可以解决您的查询。

此处有更多信息:https://api.flutter.dev/flutter/widgets/State-class.html

将代码更改为:

class _SignInScreenState extends State<SignInScreen> {
  final formKey = new GlobalKey<FormState>();

  String countryCode;

  @override
  initState() {
    Locale myLocale = Localizations.localeOf(context);
    countryCode = myLocale.countryCode;
  }

  // use variable here...
  @override
  Widget build(BuildContext context) {...