即使我在 initState 中初始化变量,Dart 也会抛出 LateInitializationError
Posted
技术标签:
【中文标题】即使我在 initState 中初始化变量,Dart 也会抛出 LateInitializationError【英文标题】:Dart throws LateInitializationError even when I initialize variables in initState 【发布时间】:2021-11-08 04:33:13 【问题描述】:我使用late
关键字声明了两个变量,这样我就可以在initState
函数中初始化它们。
class _CustomNavBarState extends State<CustomNavBar>
with TickerProviderStateMixin
late AnimationController _animationController;
late Animation<double> _animation;
@override
void initState()
super.initState();
AnimationController _animationController =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
Animation<double> _animation =
Tween<double>(begin: 1, end: 0.8).animate(_animationController);
//...
如果 initState
在任何其他函数之前被调用,为什么会出现以下错误?
LateIinitializationError:字段“_animation@17200479”尚未初始化。
这里还有一些代码:
class CustomNavBar extends StatefulWidget
const CustomNavBar(
required this.icons,
required this.names,
required this.onPressed,
required this.activeIndex);
final List<IconData> icons;
final List<String> names;
final Function(int) onPressed;
final int activeIndex;
@override
_CustomNavBarState createState() => _CustomNavBarState();
class _CustomNavBarState extends State<CustomNavBar>
with TickerProviderStateMixin
late AnimationController _animationController;
late Animation<double> _animation;
@override
void didUpdateWidget(CustomNavBar oldWidget)
super.didUpdateWidget(oldWidget);
if (oldWidget.activeIndex != widget.activeIndex)
_animate();
void _animate()
_animationController.forward();
@override
void initState()
super.initState();
AnimationController _animationController =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
Animation<double> _animation =
Tween<double>(begin: 1, end: 0.8).animate(_animationController);
@override
Widget build(BuildContext context)
return Container(
height: 90,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Theme.of(context).backgroundColor, Colors.black],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
)),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
for (var i = 0; i < widget.icons.length; i++)
TextButton(
style:
TextButton.styleFrom(splashFactory: NoSplash.splashFactory),
onPressed: () => widget.onPressed(i),
child: ScaleTransition(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
widget.icons[i],
size: 30,
color: i == widget.activeIndex
? Theme.of(context).accentColor
: Colors.white70,
),
Text(
widget.names[i],
style: TextStyle(
color: i == widget.activeIndex
? Theme.of(context).accentColor
: Colors.white70,
),
)
]),
scale: _animation))
],
),
);
【问题讨论】:
在 initState() 中移除 AnimationController 和 Animation这是声明一个本地变量:
AnimationController _animationController =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
你想要的是分配给你现有的类成员变量:
_animationController =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
【讨论】:
以上是关于即使我在 initState 中初始化变量,Dart 也会抛出 LateInitializationError的主要内容,如果未能解决你的问题,请参考以下文章
成员变量得到一个随机值,即使我在构造函数中初始化它 - 为什么?
在 Widget 的 initState 中使用 Provider 或初始化生命周期
将文档中的值从数据库保存到 initState 值的颤振问题
如何在 initstate() 中读取和使用共享偏好值?我可以在其他小部件中读取和使用值,但不能在我在 initstate 中调用的 API 中读取和使用值