user14451514
user14451514

Reputation:

Could not find a generator for route RouteSettings("SecondScreens", null) in the _WidgetsAppState

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

Answers (1)

Fabrizio
Fabrizio

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

Related Questions