参数类型“AnimationController?” 无法分配给参数类型“Animation<double>”

Sun*_*nny 4 dart flutter flutter-layout flutter-animation flutter-web

我是颤振新手。

所以我尝试在颤动中使用曲线动画,但它给了我一个标题中提到的类型错误。我在下面分享了我的 main.dart 和welcome_screen.dart。在文档 https://flutter.dev/docs/development/ui/animations/tutorial中,他们还使用了动画控制器和曲线(以及 Tween),我想我也做了同样的事情。怎么解决这个问题呢?

主程序.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(),
      },
    );   } }
Run Code Online (Sandbox Code Playgroud)

欢迎屏幕.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'),
                ),
              ),
            )
          ],
        ),
      ),
    );   } }
Run Code Online (Sandbox Code Playgroud)

我的完整错误如下

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);
                                        ^
Run Code Online (Sandbox Code Playgroud)

Kri*_*ali 11

您需要像下面这样使用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);
    });   }
Run Code Online (Sandbox Code Playgroud)

AnimationController可以分配给,Animation<Double>因为AnimationController extends Animation<double>唯一的问题是零安全性。在本教程中,它们已AnimationController使用Late关键字进行初始化,但既然AnimationController?您已经使用了,则需要使其为空安全。