我无法使用rabbitmq在flutter中进行后台服务

h5x*_*xde 7 notifications android rabbitmq flutter

在应用程序中,我使用rabbitmq、background_fetch和flutter_local_notifications。\n当应用程序启动或最小化时,一切正常,但是当它关​​闭时,我无法在后台运行我的应用程序,我找不到任何关于此的信息,所有其他问题仅针对FCM,没有更多关于 flutter 和 amqp 的信息,我是这个框架的新手

\n

主程序.dart

\n
Future<void> backgroundFetchHeadlessTask(String taskId) async {\n\n  await Rabbitmq.getDelivery();\n\n  BackgroundFetch.finish(taskId);\n}\n\nfinal FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();\n\n// Streams are created so that app can respond to notification-related events since the plugin is initialised in the `main` function\nfinal BehaviorSubject<ReceivedNotification> didReceiveLocalNotificationSubject = BehaviorSubject<ReceivedNotification>();\n\nfinal BehaviorSubject<String> selectNotificationSubject = BehaviorSubject<String>();\n\nNotificationAppLaunchDetails notificationAppLaunchDetails;\n\nvoid main() async {\n\n  runApp(MyApp());\n\n  await initPlatformState();\n  \n}\n\nFuture<void> initPlatformState() async {\n  \n    BackgroundFetch.configure(BackgroundFetchConfig(\n        startOnBoot: true,\n        minimumFetchInterval: 15,\n        stopOnTerminate: false,\n        enableHeadless: true,\n        requiresBatteryNotLow: false,\n        requiresCharging: false,\n        requiresStorageNotLow: false,\n        requiresDeviceIdle: false,\n        requiredNetworkType: NetworkType.ANY\n    ), (String taskId) async {\n        await backgroundFetchHeadlessTask(taskId);\n      } \n    );\n  }\n\nclass MyApp extends StatefulWidget {\n  @override\n  _MyAppState createState() => _MyAppState();\n}\n\nclass _MyAppState extends State<MyApp> {\n\n  @override\n  void initState() {\n    super.initState();\n    _requestIOSPermissions();\n    _configureDidReceiveLocalNotificationSubject();\n    _configureSelectNotificationSubject();\n\n    BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask);\n    \n  }\n\n  void _requestIOSPermissions() {\n    flutterLocalNotificationsPlugin\n        .resolvePlatformSpecificImplementation<\n            IOSFlutterLocalNotificationsPlugin>()\n        ?.requestPermissions(\n          alert: true,\n          badge: true,\n          sound: true,\n        );\n  }\n\n  void _configureDidReceiveLocalNotificationSubject() {\n    didReceiveLocalNotificationSubject.stream\n        .listen((ReceivedNotification receivedNotification) async {\n      await showDialog(\n        context: context,\n        builder: (BuildContext context) => CupertinoAlertDialog(\n          title: receivedNotification.title != null\n              ? Text(receivedNotification.title)\n              : null,\n          content: receivedNotification.body != null\n              ? Text(receivedNotification.body)\n              : null,\n          actions: [\n            CupertinoDialogAction(\n              isDefaultAction: true,\n              child: Text('Ok'),\n              onPressed: () async {\n                Navigator.of(context, rootNavigator: true).pop();\n                await Navigator.push(\n                  context,\n                  MaterialPageRoute(\n                    builder: (context) =>\n                        LandingPage(selectedPage: 3),\n                        //SecondScreen(receivedNotification.payload),\n                  ),\n                );\n              },\n            )\n          ],\n        ),\n      );\n    });\n  }\n\n  void _configureSelectNotificationSubject() {\n    selectNotificationSubject.stream.listen((String payload) async {\n      await Navigator.push(\n        context,\n        MaterialPageRoute(builder: (context) => LandingPage(selectedPage: 3)),//SecondScreen(payload)),\n      );\n    });\n  }\n\n  @override\n  void dispose() {\n    didReceiveLocalNotificationSubject.close();\n    selectNotificationSubject.close();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n   return MaterialApp(\n     debugShowCheckedModeBanner: false,\n      title: 'My first app',\n      theme: ThemeData(\n        primarySwatch: Colors.blue,\n        visualDensity: VisualDensity.adaptivePlatformDensity,\n      ),\n      home: LandingPage(),\n    );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在rabbitmq.dart里面

\n
class Rabbitmq {\n\n  static Future getDelivery() async\n  {\n    var auth = await DBProvider.db.getAuth();\n\n      print(hash);\n\n      Client client = new Client(\n        settings: ConnectionSettings(\n          host: 'myhost',\n          authProvider: AmqPlainAuthenticator('user', 'password')\n        )\n      );\n\n      client\n      .channel()\n      .then((Channel channel) => channel.queue("queue", durable: true))\n      .then((Queue queue) => queue.consume())\n      .then((Consumer consumer) => consumer.listen((AmqpMessage message) async {\n\n          Map messageBody = message.payloadAsJson;\n\n          if(messageBody.containsKey('message') == true && messageBody.containsKey('from') == true)\n          {\n            await Rabbitmq()._showNotification(messageBody['message'], messageBody['from']);\n          }\n\n        })\n      );\n  }\n\n  Future<void> _showNotification(String text, String from) async {\n\n    var initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher');\n    var initializationSettingsIOS = new IOSInitializationSettings();\n    var initializationSettings = new InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS);\n\n    FlutterLocalNotificationsPlugin().initialize(initializationSettings);\n    \n    final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();\n\n    var androidPlatformChannelSpecifics = AndroidNotificationDetails(\n        'com.example.g2r_market/chat', '\xd0\xa3\xd0\xb2\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbc\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f \xd1\x87\xd0\xb0\xd1\x82\xd0\xb0', '\xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb0 \xd1\x83\xd0\xb2\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbc\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb9 \xd0\xb4\xd0\xbb\xd1\x8f \xd1\x87\xd0\xb0\xd1\x82\xd0\xbe\xd0\xb2',\n        importance: Importance.Max, priority: Priority.High, ticker: 'ticker'\n    );\n\n    var iOSPlatformChannelSpecifics = IOSNotificationDetails();\n\n    var platformChannelSpecifics = NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);\n\n    await flutterLocalNotificationsPlugin.show(   \n        0, from, text, platformChannelSpecifics,\n        payload: 'item x');\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n