我是 flutter 应用程序的新手。我使用了flutter本地推送通知,如下example link , video 。它工作正常,但单击通知时页面不会导航和重新加载。
如何在单击通知时导航并重新加载页面?
我还创建了第二个屏幕(这是导航页面),但在此代码中 selectNotification 功能不起作用。
//notification_service.dart
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/data/latest.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
import 'secondscreen.dart';
import 'main.dart';
class NotificationService {
//NotificationService a singleton object
static final NotificationService _notificationService =
NotificationService._internal();
factory NotificationService() {
return _notificationService;
}
NotificationService._internal();
static const channelId = '123';
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
Future<void> init() async {
final AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('@mipmap/ic_launcher');
final IOSInitializationSettings initializationSettingsIOS =
IOSInitializationSettings(
requestSoundPermission: false,
requestBadgePermission: false,
requestAlertPermission: false,
);
final InitializationSettings initializationSettings =
InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsIOS,
macOS: null);
tz.initializeTimeZones();
await flutterLocalNotificationsPlugin.initialize(initializationSettings,
onSelectNotification: selectNotification);
}
AndroidNotificationDetails _androidNotificationDetails =
AndroidNotificationDetails(
'channel ID',
'channel name',
'channel description',
playSound: true,
priority: Priority.high,
importance: Importance.high,
);
Future<void> showNotifications() async {
await flutterLocalNotificationsPlugin.show(
0,
"Notification sundar",
"This is the Notification Body!",
NotificationDetails(android: _androidNotificationDetails),
);
}
Future<void> scheduleNotifications() async {
await flutterLocalNotificationsPlugin.zonedSchedule(
0,
"Notification Title",
"This is the Notification Body!",
tz.TZDateTime.now(tz.local).add(const Duration(seconds: 5)),
NotificationDetails(android: _androidNotificationDetails),
androidAllowWhileIdle: true,
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation.absoluteTime);
}
Future<void> cancelNotifications(int id) async {
await flutterLocalNotificationsPlugin.cancel(id);
}
Future<void> cancelAllNotifications() async {
await flutterLocalNotificationsPlugin.cancelAll();
}
}
Future selectNotification(String payload) async {
//handle your logic here
print('String');
if (payload != null) {
print('sundar');
BuildContext context;
Navigator.push(
context,
MaterialPageRoute<void>(builder: (context) => SecondScreen()),
);
}
}
//main.dart
import 'secondscreen.dart';
import 'package:flutter/material.dart';
import 'package:tasker/notification_service.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
NotificationService().init();
// NotificationService().requestIOSPermissions(); //
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
accentColor: Colors.indigo.shade900,
appBarTheme: AppBarTheme(color: Colors.indigo.shade900)),
home: MyHomePage(title: 'Flutter Local Notifications'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
NotificationService _notificationService = NotificationService();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Container(
margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 10),
child: Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
RaisedButton(
child: Text('Show Notification'),
padding: const EdgeInsets.all(10),
onPressed: () async {
await _notificationService.showNotifications();
},
),
SizedBox(height: 3),
RaisedButton(
child: Text('Schedule Notification'),
padding: const EdgeInsets.all(10),
onPressed: () async {
await _notificationService.scheduleNotifications();
},
),
SizedBox(height: 3),
RaisedButton(
child: Text('Cancel Notification'),
padding: const EdgeInsets.all(10),
onPressed: () async {
await _notificationService.cancelNotifications(0);
},
),
SizedBox(height: 3),
RaisedButton(
child: Text('Cancel All Notifications'),
padding: const EdgeInsets.all(10),
onPressed: () async {
await _notificationService.cancelAllNotifications();
},
),
SizedBox(height: 3),
SizedBox(height: 3),
RaisedButton(
child: Text('naviagte page'),
padding: const EdgeInsets.all(10),
onPressed: () {
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => SecondScreen()),
// );
},
),
],
),
)));
}
}
最佳答案
最简单的方法是使用导航键
。您可以阅读this了解更多信息.
首先定义NavigationService
类
import 'package:flutter/material.dart';
final NavigationService navService = NavigationService();
class NavigationService<T, U> {
static GlobalKey<NavigatorState> navigationKey = GlobalKey<NavigatorState>();
Future<T> pushNamed(String routeName, {Object args}) async =>
navigationKey.currentState.pushNamed<T>(
routeName,
arguments: args,
);
Future<T> push(Route<T> route) async =>
navigationKey.currentState.push<T>(route);
Future<T> pushReplacementNamed(String routeName, {Object args}) async =>
navigationKey.currentState.pushReplacementNamed<T, U>(
routeName,
arguments: args,
);
Future<T> pushNamedAndRemoveUntil(
String routeName, {
Object args,
bool keepPreviousPages = false,
}) async =>
navigationKey.currentState.pushNamedAndRemoveUntil<T>(
routeName,
(Route<dynamic> route) => keepPreviousPages,
arguments: args,
);
Future<T> pushAndRemoveUntil(
Route<T> route, {
bool keepPreviousPages = false,
}) async =>
navigationKey.currentState.pushAndRemoveUntil<T>(
route,
(Route<dynamic> route) => keepPreviousPages,
);
Future<bool> maybePop([Object args]) async =>
navigationKey.currentState.maybePop<bool>(args);
bool canPop() => navigationKey.currentState.canPop();
void goBack({T result}) => navigationKey.currentState.pop<T>(result);
}
在这里您可以定义您的路线
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
navigatorKey: NavigationService.navigationKey,
theme: ThemeData(
primarySwatch: Colors.blue,
accentColor: Colors.indigo.shade900,
appBarTheme: AppBarTheme(color: Colors.indigo.shade900)),
onGenerateRoute: (RouteSettings settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute(builder: (_) => MyHomePage());
case '/second_screen':
return MaterialPageRoute(builder: (_) => SecondScreen(settings.arguments)
}
},
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
NotificationService _notificationService = NotificationService();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Container(
margin: const EdgeInsets.symmetric(vertical: 10, horizontal:10),
child: Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
//your child
],
),
),
),
);
}
}
以及NotificationService
Future selectNotification(String payload) async {
//handle your logic here
print('String');
if (payload != null) {
navService.pushNamed('/detail_screen', args: payload);;
}
}
关于javascript - 单击本地推送通知时如何在 flutter 中导航和重新加载页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70401554/