вызов функции onGenerateRoute без аргументов

#flutter #navigation #arguments

Вопрос:

Интересно, как мы можем вызвать generateRoute без аргументов на generateroute: RouteGenerator.generateRoute

я ожидал бы: RouteGenerator.generateRoute(настройки)

Спасибо,

 class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<int>(
        stream: NumberCreator().stream,
        builder: (context, snapshot) {
          print('StreamBuilder: ${snapshot.connectionState}');

          return MaterialApp(
            title: 'Demo',
            **onGenerateRoute: RouteGenerator.generateRoute,**
            onGenerateInitialRoutes: (String initialRouteName) {
              return [
                RouteGenerator.generateRoute(
                    RouteSettings(name: '/', arguments: snapshot)),
              ];
            },
          );
        });
  }
}

class RouteGenerator {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    final args = settings.arguments;

    switch (settings.name) {
      case '/':
        if (args is AsyncSnapshot<int>) {
 

Ответ №1:

На самом деле вы вызываете не onGenerateRoute без аргументов, а потому, что передаете параметры, соответствующие ожидаемому типу, RouteFactory определенному следующим образом в документации flutter:

 typedef RouteFactory = Route<dynamic>? Function(RouteSettings settings);
 

И вы generateRoute соответствуете этому типу, поскольку это функция, которая принимает RouteSettings параметр и возвращает объект типа Route<dynamic> .

Вот код, который я использовал в своих проектах:

 class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Demo',
      initialRoute: /*<my_initial_route */,
      onGenerateRoute: MyRouter.generateRoute,
    );
  }
}

class RouteGenerator {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      // your cases ...
      default:
        return MaterialPageRoute(
          builder: (_) => Scaffold(
            body: Center(
              child: Text('No route defined for ${settings.name}'),
            ),
          ),
        );
    }
  }
}