无法在 PushNamed 上获取参数(总是 return Null)

Can't get arguments on PushNamed (always return Null)

我试图在点击通知时获取参数。

结构是:

    await _notificationsPlugin.show(
            id,
            message.notification!.title,
            message.notification!.body,
            notificationDetails,
            payload: json.encode(message.data),
          );
_notificationsPlugin.initialize(initializationSettings,
        // ignore: avoid_types_on_closure_parameters
        onSelectNotification: (String? payload) async {
      final args = json.decode(payload!);
      if (args.route != null) {
        Navigator.pushNamed(context, args.route,
            arguments: 'data');
      }
    });
class AppRouter {
  Route? onGenerateRoute(RouteSettings settings) {
    print('${settings.arguments}'); // always Null

    switch (settings.name) {
      case '/home':
        return MaterialPageRoute(
          builder: (_) => BlocProvider<HomeBloc>(
            create: (context) => getIt<HomeBloc>()
              ..add(GetInfos(data: settings.arguments)),
            child: HomePage(data: settings.arguments),
          ),
        );
      default:
        return null;
    }
  }
}

更新

我更新了我的代码,用于在 MaterialPageRoute 中传递设置并使用 ModalRoute 获取参数,但不起作用..它始终为 null...

class AppRouter {
  Route? onGenerateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/home':
        return MaterialPageRoute(settings: settings, builder: (_) => Screen());
      default:
        return null;
    }
  }
}
class Screen extends StatelessWidget {
  const Screen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final dynamic args = ModalRoute.of(context)!.settings.arguments;
    print(args); // always Null

    return BlocProvider<HomeBloc>(
      create: (context) => getIt<HomeBloc>()
        ..add(GetInfos(data: args)),
      child: HomePage(data: args),
    );
  }
}

onGenerateRoute中,创建MaterialPageRoute时传递接收到的路由设置:

settings: settings,

在此之后,在您设置为 child 的小部件中,例如 HomePage,您可以访问使用 pushNamed 传递的参数,例如(您需要有上下文):

final dynamic args = ModalRoute.of(context)!.settings.arguments;

编辑:请在下面找到一个最小的工作示例,该示例将带有 onGenerateRoute 的参数传递到另一个屏幕,并在那里提取它:

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(onGenerateRoute: (settings) {
      switch (settings.name) {
        case '/':
          return MaterialPageRoute(builder: (context) => const MyHome());
        case 'myscreen':
          return MaterialPageRoute(
              builder: (context) => const MyScreen(), settings: settings);
      }
    });
  }
}

class MyHome extends StatelessWidget {
  const MyHome({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('MyHome'),
        ),
        body: Center(
            child: ElevatedButton(
                child: const Text('Go to MyScreen with argument: "hello"'),
                onPressed: () => Navigator.pushNamed(context, 'myscreen',
                    arguments: 'hello'))));
  }
}

class MyScreen extends StatelessWidget {
  const MyScreen({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    final args =
        ModalRoute.of(context)!.settings.arguments ?? 'no argument given';
    print(args);
    return Scaffold(
      appBar: AppBar(
        title: const Text('MyScreen'),
      ),
      body: Center(child: Text(args as String)),
    );
  }
}