Reputation:
I am trying to move through the multiple FloatingActionButton to a second page, but I am faced with the following problem after pressing any of the FloatingActionButton popups: Could not find a generator for route RouteSettings("SecondScreens", null) in the _WidgetsAppState.
Where is the problem and how can it be solved if someone knows it helps me.
full code
import 'package:flutter/material.dart';
import 'dart:math' as math;
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
State createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
AnimationController _controller;
static const List<IconData> icons = const [
Icons.sms,
Icons.mail,
Icons.phone
];
@override
void initState() {
_controller = new AnimationController(
vsync: this,
duration: const Duration(milliseconds: 500),
);
}
Widget build(BuildContext context) {
Color backgroundColor = Theme.of(context).cardColor;
Color foregroundColor = Theme.of(context).accentColor;
return new Scaffold(
appBar: new AppBar(title: new Text('Speed Dial Example')),
floatingActionButton: new Column(
mainAxisSize: MainAxisSize.min,
children: new List.generate(icons.length, (int index) {
Widget child = new Container(
height: 70.0,
width: 56.0,
alignment: FractionalOffset.topCenter,
child: new ScaleTransition(
scale: new CurvedAnimation(
parent: _controller,
curve: new Interval(0.0, 1.0 - index / icons.length / 2.0,
curve: Curves.easeOut),
),
child:
fabWidget(context, index, backgroundColor, foregroundColor),
),
);
return child;
}).toList()
..add(
new FloatingActionButton(
heroTag: null,
child: new AnimatedBuilder(
animation: _controller,
builder: (BuildContext context, Widget child) {
return new Transform(
transform: new Matrix4.rotationZ(
_controller.value * 0.5 * math.pi),
alignment: FractionalOffset.center,
child: new Icon(
_controller.isDismissed ? Icons.share : Icons.close),
);
},
),
onPressed: () {
if (_controller.isDismissed) {
_controller.forward();
} else {
_controller.reverse();
}
},
),
),
),
);
}
Widget fabWidget(BuildContext context, int index, Color backgroundColor,
Color foregroundColor) {
String route = "";
switch (index) {
case 0:
route = "SecondScreens";
break;
case 1:
route = "thirdScreen";
break;
default:
}
return FloatingActionButton(
heroTag: null,
backgroundColor: backgroundColor,
mini: true,
child: new Icon(icons[index], color: foregroundColor),
onPressed: () {
Navigator.pushNamed(context, route);
},
);
}
}
Upvotes: 2
Views: 4408
Reputation: 1074
You're using Navigator.pushNamed
which requires the routes that you put as the second parameter to be defined in the App routes property like this:
MaterialApp(
// Start the app with the "/" named route. In this case, the app starts
// on the FirstScreen widget.
initialRoute: '/',
routes: {
// When navigating to the "/" route, build the FirstScreen widget.
'/': (context) => FirstScreen(),
// When navigating to the "/second" route, build the SecondScreen widget.
'/second': (context) => SecondScreen(),
},
);
Each route is defined as MapEntry and the first part is the route name, so the argument that you called "routeName" and the second one is a Widget constructor which is the page that you want that route to correspond to.
In your case you would add something like:
MaterialApp(
// Start the app with the "/" named route. In this case, the app starts
// on the FirstScreen widget.
initialRoute: '/',
routes: {
// When navigating to the "/" route, build the FirstScreen widget.
'/': (context) => MyHomePage(),
// When navigating to the "/second" route, build the SecondScreens widget.
'/second': (context) => SecondScreens(),
// When navigating to the "/third" route, build the thirdScreens widget.
'/third': (context) => SecondScreens(),
///All the other screens in your app.
},
);
Then your fabWidget function could be changed to this:
Widget fabWidget(BuildContext context, int index, Color backgroundColor,
Color foregroundColor) {
String route = "";
switch (index) {
case 0:
route = "/second";
break;
case 1:
route = "/third";
break;
default:
}
return FloatingActionButton(
heroTag: null,
backgroundColor: backgroundColor,
mini: true,
child: new Icon(icons[index], color: foregroundColor),
onPressed: () {
Navigator.pushNamed(context, route);
},
);
}
Upvotes: 2