【问题标题】:Declaring a variable without initializing it flutter声明一个变量而不初始化它颤动
【发布时间】:2021-10-28 13:15:02
【问题描述】:
我想声明一个静态变量并在下面的函数中初始化它,但是得到错误:“不可为空的变量'screenWidth'必须被初始化。”
代码:
import 'package:flutter/material.dart';
class SizeConfig {
static MediaQueryData _mediaQueryData;
static double screenWidth;
static double screenHeight;
static double defaultSize;
static Orientation orientation;
void init(BuildContext context) {
_mediaQueryData = MediaQuery.of(context);
screenWidth = _mediaQueryData.size.width;
screenHeight = _mediaQueryData.size.height;
orientation = _mediaQueryData.orientation;
}
}
【问题讨论】:
标签:
flutter
variables
static
declaration
non-nullable
【解决方案1】:
您可以使用late 关键字,因为您处于空安全状态,并且您想在后面初始化字段。
通过声明一个不可为空的后期变量,我们保证它在运行时不为空,Dart 帮助我们提供了一些编译时保证。
但我建议仅谨慎使用late,并始终在声明后期变量时对其进行初始化。
import 'package:flutter/material.dart';
class SizeConfig {
static late MediaQueryData _mediaQueryData;
static late double screenWidth;
static late double screenHeight;
static late double defaultSize;
static late Orientation orientation;
void init(BuildContext context) {
_mediaQueryData = MediaQuery.of(context);
screenWidth = _mediaQueryData.size.width;
screenHeight = _mediaQueryData.size.height;
orientation = _mediaQueryData.orientation;
}
}
另外一件事是,如果你想将你的字段设为nullable,那么你可以在下面的类型之后使用? 来制作主题nullable。
import 'package:flutter/material.dart';
class SizeConfig {
static MediaQueryData? _mediaQueryData;
static double? screenWidth;
static double? screenHeight;
static double? defaultSize;
static Orientation? orientation;
void init(BuildContext context) {
_mediaQueryData = MediaQuery.of(context);
screenWidth = _mediaQueryData?.size.width;
screenHeight = _mediaQueryData?.size.height;
orientation = _mediaQueryData?.orientation;
}
}
【解决方案2】:
在声明变量的数据类型后使用late关键字或?,以便flutter知道您稍后将在某个时间点初始化该变量,否则该变量将为空。
例子:
late int variable; //the variable will be initialised later
或
int? variable; // the variable can either have a value or can be null.