I am new to Flutter.
So I am trying to use Curved animations in flutter but it gives me a type error as mentioned in the title. I have shared my main.dart and welcome_screen.dart below. In documentation https://flutter.dev/docs/development/ui/animations/tutorial they have also used the Animationcontroller and a curve (along with Tween) and I think I have done the same. How to solve this?
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'),
),
),
)
],
),
),
); } }
My full error is below
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);
^
CodePudding user response:
You need to use controller!
here CurvedAnimation(parent: controller!...
like bellow:
@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
can be assigned to Animation<Double>
since AnimationController extends Animation<double>
the only problem is of null safety. In the tutorial they have initialized AnimationController
with late keyword but since you have used AnimationController?
you need to make it null safe.
CodePudding user response:
AnimationController used with late keyword In the tutorial they have initialized so using late keyword you do'nt need to make null safe every where and initstate it will initialize compulasary because of using late keyword.
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);
}); }