【问题标题】:How to navigate to a specific tab on BottomNavigationBar from a push notification?如何从推送通知导航到 BottomNavigationBar 上的特定选项卡?
【发布时间】:2019-08-26 20:10:00
【问题描述】:

我想我的方法涉及设置到像这样的通知选项卡:

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

但是从后台恢复时似乎没有调用initState。

  @override
  void initState() {
super.initState();
PreferenceUtil.showNotifications().then((showNotification) async {
  print("the show notification state is:" +showNotification.toString());
  await PreferenceUtil.clearNotificationKey();
  if (showNotification) {
    setState(() {
      _selectedIndex = 1;
    });
  }
});

}

【问题讨论】:

标签: flutter


【解决方案1】:

总体方法是将一个 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 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),
  }
);
}
}

MainPage(缩写):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多