【问题标题】:How to perform arithmetic operation on Late Variable in Flutter?如何对 Flutter 中的后期变量进行算术运算?
【发布时间】: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"))
          ],
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    你已经在类中声明了_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();
          }
        });
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-10
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 2014-05-05
      • 2021-05-26
      • 1970-01-01
      相关资源
      最近更新 更多