首页 > 解决方案 > 在颤动中访问上下文

问题描述

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

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 的值,这是否意味着每次重绘小部件树时都会重置它?

标签: flutter

解决方案


initState 的主要目的是初始化变量,它只会在小部件被销毁时被调用,所以只要不调用小部件的 dispose 方法,通过 initState 初始化的变量将是活动的,你可以使用它构建方法。

关于 build 方法,所以每当您在 widget 中更改某些内容时,Flutter 都会调用 build 方法并通过它返回的内容重新渲染 widget,它与 initState 无关,这本质上称为“Hot Reload”。希望这能解决您的查询。

更多信息在这里: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) {...

推荐阅读