【问题标题】:Can't get arguments on PushNamed (always return Null)无法在 PushNamed 上获取参数(总是返回 Null)
【发布时间】:2021-11-19 13:47:46
【问题描述】:

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

结构是:

  • Firebase 云消息传递发送带有路由名称和其他值的通知。
    await _notificationsPlugin.show(
            id,
            message.notification!.title,
            message.notification!.body,
            notificationDetails,
            payload: json.encode(message.data),
          );
  • 我在选择通知时添加了 PushNamed。
_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');
      }
    });
  • 并通过 onGenerateRoute a 尝试获取此参数。我得到了路由名称,但没有任何参数......我尝试使用 String、int、Object ......没有任何变化。 参数始终为 Null
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),
    );
  }
}

【问题讨论】:

    标签: firebase flutter firebase-cloud-messaging


    【解决方案1】:

    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)),
        );
      }
    }
    

    【讨论】:

    • 你的解决方案不起作用......我用这个新代码更新了我的问题,是的......参数总是返回 null......,你对我的问题有其他想法吗?
    • 所以在AppRouter 类中,onGenerateRoute 函数:settings.name "home" 和settings.arguments 是否为空?而args.route 中的onSelectNotification 也是“家”?
    • 没错,args.route 和 settings.name 返回 "home" 但 settings.arguments 为空
    • 我真的不明白,为什么它不起作用。我将在我的答案中添加一个最小的、可重现的示例,实现我之前写的内容,也许它会有所帮助。
    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 2021-07-30
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多