【发布时间】:2021-11-27 12:20:41
【问题描述】:
定义一个变量而不初始化它。
动画控制器_控制器;
抛出错误:必须初始化不可为空的实例字段“_controller”。
在网上,有3种方法可以解决这个问题,但都有其局限性。
解决方案_1。后期 AnimationController _controller;
缺点:不能进行这样的算术运算,sum = (_controller.value) * 200, sum = (_controller!.value)! * 200,总和 = (_controller?.value)! * 200 .
解决方案_2。 AnimationController _controller = AnimationController(vsync: this, duration: Duration(seconds: 1)); //在类中全局定义和初始化
缺点:vsync 会抛出错误,因为它不在任何函数内。 (对“this”表达式的引用无效。
解决方案_3。 AnimationController _controller = AnimationController(vsync: this, duration: Duration(seconds: 1)); //在 initState() 中定义和初始化
缺点:不能在任何其他方法中使用_controller。
由于所有这些问题,我无法使用 _controller 执行算术运算。有没有办法解决这个问题? 这是我的代码供参考-
import 'dart:math';
import 'package:flutter/material.dart';
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen>
with SingleTickerProviderStateMixin {
int leftDice = 1, rightDice = 1;
Random random = Random();
late AnimationController _controller;
@override
void initState() {
super.initState();
animate();
print("Init called");
}
@override
void dispose() {
super.dispose();
_controller?.dispose();
}
void animate() {
print("Animate called");
AnimationController _controller =
AnimationController(vsync: this, duration: Duration(seconds: 1));
_controller.addListener(() {
setState(() {});
});
_controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
print("Compleated");
_controller.reverse();
}
});
}
void roll() {
_controller?.forward();
setState(() {
leftDice = random.nextInt(6) + 1;
rightDice = random.nextInt(6) + 1;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Dicee"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
children: [
Expanded(
child: Padding(
padding: EdgeInsets.all(15),
child: GestureDetector(
onDoubleTap: roll,
child: Image(
height: 200 - (_controller!.value)! * 200,
image: AssetImage('assets/images/dice-$leftDice.png'),
),
),
)),
Expanded(
child: Padding(
padding: EdgeInsets.all(15),
child: GestureDetector(
onDoubleTap: roll,
child: Image(
image: AssetImage('assets/images/dice-$rightDice.png'),
),
),
))
],
),
ElevatedButton(onPressed: roll, child: Text("Roll Dice"))
],
),
),
);
}
}
【问题讨论】: