Тип аргумента ‘AnimationController?’ не может быть присвоен типу параметра ‘Animation’

#flutter #dart #flutter-layout #flutter-web #flutter-animation

Вопрос:

Я новичок в Flutter.

Итак, я пытаюсь использовать изогнутые анимации в flutter, но это выдает ошибку типа, как указано в названии. Я поделился своим main.dart и welcome_screen.щелкните ниже. В документации https://flutter.dev/docs/development/ui/animations/tutorial они также использовали Animationcontroller и кривую (вместе с анимацией), и я думаю, что сделал то же самое. Как это решить?

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<Double> , поскольку AnimationController extends Animation<double> единственная проблема заключается в нулевой безопасности. В руководстве они инициализированы AnimationController с помощью ключевого слова late, но поскольку вы использовали AnimationController? , вам нужно сделать его безопасным для null.

Комментарии:

1. Абсолютно верно, братан, спасибо!!!!

Ответ №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);
  });   }
 

Комментарии:

1. Я как-то пропустил это. Большое спасибо!!!!