参数类型“AnimationController?”不能分配给参数类型'Animation<double>'

Posted

技术标签:

【中文标题】参数类型“AnimationController?”不能分配给参数类型\'Animation<double>\'【英文标题】:The argument type 'AnimationController?' can't be assigned to the parameter type 'Animation<double>'参数类型“AnimationController?”不能分配给参数类型'Animation<double>' 【发布时间】:2021-12-11 22:01:17 【问题描述】:

我是 Flutter 的新手。

所以我试图在颤振中使用曲线动画,但它给了我标题中提到的类型错误。我在下面分享了我的 main.dart 和 welcome_screen.dart。在documentationhttps://flutter.dev/docs/development/ui/animations/tutorial 中,他们还使用了动画控制器和曲线(连同 Tween),我想我也这样做了。如何解决?

main.dart

import 'package:flutter/material.dart'; import 'package:flash_chat/screens/welcome_screen.dart'; import 'package:flash_chat/screens/login_screen.dart'; import 'package:flash_chat/screens/registration_screen.dart'; import 'package:flash_chat/screens/chat_screen.dart';

void main() => runApp(FlashChat());

class FlashChat extends StatelessWidget    @override   Widget build(BuildContext context) 
    return MaterialApp(
      theme: ThemeData.dark().copyWith(
        textTheme: TextTheme(bodyText1: TextStyle(color: Colors.black54)),
      ),
      initialRoute: WelcomeScreen.id,
      routes: 
        WelcomeScreen.id: (context) => WelcomeScreen(),
        LoginScreen.id: (context) => LoginScreen(),
        RegistrationScreen.id: (context) => RegistrationScreen(),
        ChatScreen.id: (context) => ChatScreen(),
      ,
    );    

welcome_screen.dart

import 'package:flutter/material.dart'; import 'package:flash_chat/screens/login_screen.dart'; import 'package:flash_chat/screens/registration_screen.dart';

class WelcomeScreen extends StatefulWidget    static const String id
= 'welcome_screen';

  @override   _WelcomeScreenState createState() =>
_WelcomeScreenState(); 

class _WelcomeScreenState extends State<WelcomeScreen>
    with SingleTickerProviderStateMixin    AnimationController? controller;   Animation? animation;

  @override   void initState() 
    super.initState();
    controller = AnimationController(
      vsync: this,
      duration: Duration(seconds: 1),
      upperBound: 100,
    );
    animation = CurvedAnimation(parent: controller, curve: Curves.decelerate);
    controller!.forward();

    controller!.addListener(() 
      setState(() );
      print(controller!.value);
    );   

  @override   Widget build(BuildContext context) 
    return Scaffold(
      backgroundColor: Colors.white,
      body: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 24),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            Row(
              children: [
                Hero(
                  tag: 'logo',
                  child: Container(
                    child: Image.asset('images/logo.png'),
                    height: controller!.value,
                  ),
                ),
                Text(
                  'Flash Chat',
                  style: TextStyle(
                    fontSize: 45.0,
                    fontWeight: FontWeight.w900,
                    color: Colors.blueGrey.shade300,
                  ),
                ),
              ],
            ),
            SizedBox(
              height: 48,
            ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 16),
              child: Material(
                elevation: 5.0,
                color: Colors.lightBlueAccent,
                borderRadius: BorderRadius.circular(30.0),
                child: TextButton(
                  style: ButtonStyle(
                    foregroundColor:
                        MaterialStateProperty.all<Color>(Colors.white),
                  ),
                  onPressed: () 
                    Navigator.pushNamed(context, LoginScreen.id);
                  ,
                  child: Text('Login'),
                ),
              ),
            ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 16),
              child: Material(
                elevation: 5.0,
                color: Colors.lightBlueAccent,
                borderRadius: BorderRadius.circular(30.0),
                child: TextButton(
                  style: ButtonStyle(
                    foregroundColor:
                        MaterialStateProperty.all<Color>(Colors.white),
                  ),
                  onPressed: () 
                    Navigator.pushNamed(context, RegistrationScreen.id);
                  ,
                  child: Text('Register'),
                ),
              ),
            )
          ],
        ),
      ),
    );    

我的完整错误如下

Performing hot reload...
Syncing files to device Lenovo TB 7504X...
lib/screens/welcome_screen.dart:25:41: Error: The argument type 'AnimationController?' can't be assigned to the parameter type 'Animation<double>' because 'AnimationController?' is nullable and 'Animation<double>' isn't.
 - 'AnimationController' is from 'package:flutter/src/animation/animation_controller.dart' ('/C:/src/flutter_windows_2.5.1-stable/flutter/packages/flutter/lib/src/animation/animation_controller.dart').
 - 'Animation' is from 'package:flutter/src/animation/animation.dart' ('/C:/src/flutter_windows_2.5.1-stable/flutter/packages/flutter/lib/src/animation/animation.dart').
    animation = CurvedAnimation(parent: controller, curve: Curves.decelerate);
                                        ^

【问题讨论】:

【参考方案1】:

您需要在此处使用controller! CurvedAnimation(parent: controller!...,如下所示:

 @override   void initState() 
    super.initState();
    controller = AnimationController(
      vsync: this,
      duration: Duration(seconds: 1),
      upperBound: 100,
    );
    animation = CurvedAnimation(parent: controller!, curve: Curves.decelerate);
    controller!.forward();

    controller!.addListener(() 
      setState(() );
      print(controller!.value);
    );   

AnimationController 可以分配给Animation&lt;Double&gt;,因为AnimationController extends Animation&lt;double&gt; 唯一的问题是空安全性。在本教程中,他们使用 late 关键字初始化了 AnimationController,但由于您使用了 AnimationController?,因此您需要将其设为空安全。

【讨论】:

没问题的兄弟谢谢!!!!【参考方案2】:

AnimationController 与 late 关键字一起使用在教程中他们已经初始化,因此使用 late 关键字你不需要在每个地方都使 null 安全,并且 initstate 它将因为使用 late 关键字而初始化。

late AnimationController controller; 
  Animation? animation;

@override   void initState() 
  super.initState();
  controller = AnimationController(
    vsync: this,
    duration: Duration(seconds: 1),
    upperBound: 100,
  );
  animation = CurvedAnimation(parent: controller, curve: Curves.decelerate);
  controller.forward();

  controller.addListener(() 
    setState(() );
    print(controller.value);
  );   

【讨论】:

我不知何故错过了这一点。非常感谢!!!!

以上是关于参数类型“AnimationController?”不能分配给参数类型'Animation<double>'的主要内容,如果未能解决你的问题,请参考以下文章

flutter AnimationController动画1

如何创建在使用 AnimationController 创建的倒数计时器期间发出的警报?

波纹动画颤动

Flutter:动画控制器数组

补间动画和动画控制器之间的区别

如何在父状态更改后重建子项(和重放动画)