[英]How to perform arithmetic operation on Late Variable in Flutter?
定義一個變量而不初始化它。
動畫控制器_控制器;
拋出錯誤:不可為空的實例字段“_controller”必須初始化。
在 inte.net 上,有 3 種方法可以解決這個問題,但都有其局限性。
解決方案_1。 后期AnimationController _controller;
缺點:不能進行這樣的算術運算,sum = (_controller.value) * 200, sum = (_controller.,value)? * 200.sum = (_controller..value)! * 200。
解決方案_2。 AnimationController _controller = AnimationController(vsync: this, duration: Duration(seconds: 1)); //在 class 中全局定義和初始化
缺點:vsync 拋出錯誤,因為它不在任何 function 中。(對“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"))
],
),
),
);
}
}
你已經在 class 中聲明了_controller
,你不應該再在animate
中聲明它。
嘗試這個:
void animate() {
print("Animate called");
_controller =
AnimationController(vsync: this, duration: Duration(seconds: 1));
_controller.addListener(() {
setState(() {});
});
_controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
print("Compleated");
_controller.reverse();
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.