Flutter 如何从推送通知导航到BottomNavigationBar上的特定选项卡?
我想我有一个方法,包括如下设置进入通知选项卡:Flutter 如何从推送通知导航到BottomNavigationBar上的特定选项卡?,flutter,Flutter,我想我有一个方法,包括如下设置进入通知选项卡: class NotificationUtil { static void subscribeToNotifications(BuildContext context, GlobalKey<ScaffoldState> scaffoldKey) async { final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); _firebaseMessaging.conf
class NotificationUtil {
static void subscribeToNotifications(BuildContext context, GlobalKey<ScaffoldState> scaffoldKey) async {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print("onMessage: $message");
_showNotification(scaffoldKey, message);
},
onLaunch: (Map<String, dynamic> message) async {
print("onLaunch: $message");
await PreferenceUtil.setNotificationKey();
},
onResume: (Map<String, dynamic> message) async {
print("onResume: $message");
await PreferenceUtil.setNotificationKey();
},
);
await _firebaseMessaging.getToken();
_firebaseMessaging.requestNotificationPermissions(
const IosNotificationSettings(sound: true, badge: true, alert: true));
_firebaseMessaging.onIosSettingsRegistered
.listen((IosNotificationSettings settings) {
print("Settings registered: $settings");
});
FirebaseUser firebaseUser = await AuthUtil.getFirebaseUser();
_firebaseMessaging
.subscribeToTopic(firebaseUser.email.replaceAll('@', '%'));
}
static void _showNotification(GlobalKey<ScaffoldState> scaffoldKey, Map<String, dynamic> message) {
scaffoldKey.currentState.showSnackBar(new SnackBar(
content: new Text(message['notification']['body'] as String),
));
}
}
}总体方法是向屏幕传递一个int,该int用于标识带底部栏的屏幕导航时要选择的选项卡位置
class MainPage extends StatefulWidget {
final int selectedIndex;
MainPage(this.selectedIndex);
@override
_MainPageState createState() => _MainPageState(selectedIndex);
}
我必须加入一种机制来跟踪当前正在处理的推送通知,因为当从推送通知打开应用程序时,处理将进入无限循环
这是一个更完整的实现,对我来说很有用
通知处理:
class NotificationUtil {
static void subscribeToNotifications(
BuildContext context, GlobalKey<ScaffoldState> scaffoldKey) async {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print("onMessage: $message");
_showNotification(scaffoldKey, message);
},
onLaunch: (Map<String, dynamic> message) async {
print("onLaunch: $message");
processIncomingNotification(context, message);
},
onResume: (Map<String, dynamic> message) async {
print("onResume: $message");
processIncomingNotification(context, message);
},
);
await _firebaseMessaging.getToken();
_firebaseMessaging.requestNotificationPermissions(
const IosNotificationSettings(sound: true, badge: true, alert: true));
_firebaseMessaging.onIosSettingsRegistered
.listen((IosNotificationSettings settings) {
print("Settings registered: $settings");
});
FirebaseUser firebaseUser = await AuthUtil.getFirebaseUser();
_firebaseMessaging
.subscribeToTopic(firebaseUser.email.replaceAll('@', '%'));
}
static void processIncomingNotification(BuildContext context, Map<String, dynamic> message) async {
String incomingMessage = message["data"]["google.message_id"] as String;
String currentMessage = await PreferenceUtil.getCurrentMessage();
if (incomingMessage == currentMessage) {
return;
}
await PreferenceUtil.setCurrentMessage(incomingMessage);
Navigator.pushReplacementNamed(context, "/notifications");
}
static void _showNotification(
GlobalKey<ScaffoldState> scaffoldKey, Map<String, dynamic> message) {
scaffoldKey.currentState.showSnackBar(new SnackBar(
content: new Text(message['notification']['body'] as String),
));
}
}
主页缩写:
class MainPage extends StatefulWidget {
final int selectedIndex;
MainPage(this.selectedIndex);
@override
_MainPageState createState() => _MainPageState(selectedIndex);
}
class _MainPageState extends State<MainPage> {
GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
int _selectedIndex = 0;
final _widgetOptions = [
PropertyListPage(),
NotificationListPage(),
MorePage(),
];
_MainPageState(this._selectedIndex);
也许你可以在应用程序恢复时调用你的方法?谢谢-我尝试过这个,但是如果我有嵌套的路由,它就不起作用了。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: COMPANY_NAME,
theme: ThemeData.light().copyWith(
primaryColor: const Color(0xFF13172a),
accentColor: const Color(0xFFA8C048)),
home: HomePage(title: COMPANY_NAME),
routes: {
'/notifications': (context) => MainPage(1),
}
);
}
}
class MainPage extends StatefulWidget {
final int selectedIndex;
MainPage(this.selectedIndex);
@override
_MainPageState createState() => _MainPageState(selectedIndex);
}
class _MainPageState extends State<MainPage> {
GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
int _selectedIndex = 0;
final _widgetOptions = [
PropertyListPage(),
NotificationListPage(),
MorePage(),
];
_MainPageState(this._selectedIndex);