簡體   English   中英

如何對Flutter中的Late Variable進行算術運算?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM