我有一个带有表单的屏幕,其中显示了县的下拉列表。 屏幕最初加载时,我想将默认设置为当前国家/地区。
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的值,这是否意味着每次重新绘制小部件树时都将其重置?
答案 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) {...