【问题标题】: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);
                                        ^

【问题讨论】:

    标签: flutter dart flutter-layout flutter-web flutter-animation


    【解决方案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);
      });   }
    

    【讨论】:

    • 我不知何故错过了这一点。非常感谢!!!!
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2021-12-15
    • 2020-10-25
    • 2021-01-05
    • 2018-12-26
    • 2021-06-19
    • 2021-12-13
    相关资源
    最近更新 更多