无法在 PushNamed 上获取参数(总是 return Null)
Can't get arguments on PushNamed (always return Null)
我试图在点击通知时获取参数。
结构是:
- Firebase 云消息传递发送带有路由名称和其他值的通知。
await _notificationsPlugin.show(
id,
message.notification!.title,
message.notification!.body,
notificationDetails,
payload: json.encode(message.data),
);
- 我在 select 通知时添加了一个 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),
);
}
}
在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)),
);
}
}
我试图在点击通知时获取参数。
结构是:
- Firebase 云消息传递发送带有路由名称和其他值的通知。
await _notificationsPlugin.show(
id,
message.notification!.title,
message.notification!.body,
notificationDetails,
payload: json.encode(message.data),
);
- 我在 select 通知时添加了一个 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),
);
}
}
在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)),
);
}
}