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 的值,这是否意味着每次重绘小部件树时都会重置它?
解决方案
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) {...
推荐阅读
- javascript - 多次调用同一个 Ajax 方法实例后返回 Promise
- unity3d - 编译版本中的序列化目的
- reactjs - 重构 Gatsby 图像查询
- c# - 为什么存储在对象变量中并与 == 比较的字符串有这种奇怪的行为?
- java - 在 NamedParameterJdbcTemplate 类型中不适用于参数(字符串,新的 RowMapper
(){}) - android - Firebase 对象识别类别的机器学习套件
- android - 自定义应用程序类上的 ClassNotFoundException(不在 APK/dex 文件中?)
- php - 如何从 PHP CLI 检查计算机是否在 Windows 上“全屏忙”?
- java - 从java调用带有参数作为密封类的Kotlin函数
- swift - 如何修复某些设备上的 UITableViewCell 缩小?