I can't make background service in flutter with rabbitmq

Viewed 1678

In the application I use rabbitmq, background_fetch and flutter_local_notifications. When the application is launched or minimized everything works fine, but when it is closed I cannot run my application in background, i can not find any information about this, all another questions only for FCM, no more info about flutter with amqp, I am a newbee in this framework

main.dart

Future<void> backgroundFetchHeadlessTask(String taskId) async {

  await Rabbitmq.getDelivery();

  BackgroundFetch.finish(taskId);
}

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

// Streams are created so that app can respond to notification-related events since the plugin is initialised in the `main` function
final BehaviorSubject<ReceivedNotification> didReceiveLocalNotificationSubject = BehaviorSubject<ReceivedNotification>();

final BehaviorSubject<String> selectNotificationSubject = BehaviorSubject<String>();

NotificationAppLaunchDetails notificationAppLaunchDetails;

void main() async {

  runApp(MyApp());

  await initPlatformState();
  
}

Future<void> initPlatformState() async {
  
    BackgroundFetch.configure(BackgroundFetchConfig(
        startOnBoot: true,
        minimumFetchInterval: 15,
        stopOnTerminate: false,
        enableHeadless: true,
        requiresBatteryNotLow: false,
        requiresCharging: false,
        requiresStorageNotLow: false,
        requiresDeviceIdle: false,
        requiredNetworkType: NetworkType.ANY
    ), (String taskId) async {
        await backgroundFetchHeadlessTask(taskId);
      } 
    );
  }

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  @override
  void initState() {
    super.initState();
    _requestIOSPermissions();
    _configureDidReceiveLocalNotificationSubject();
    _configureSelectNotificationSubject();

    BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask);
    
  }

  void _requestIOSPermissions() {
    flutterLocalNotificationsPlugin
        .resolvePlatformSpecificImplementation<
            IOSFlutterLocalNotificationsPlugin>()
        ?.requestPermissions(
          alert: true,
          badge: true,
          sound: true,
        );
  }

  void _configureDidReceiveLocalNotificationSubject() {
    didReceiveLocalNotificationSubject.stream
        .listen((ReceivedNotification receivedNotification) async {
      await showDialog(
        context: context,
        builder: (BuildContext context) => CupertinoAlertDialog(
          title: receivedNotification.title != null
              ? Text(receivedNotification.title)
              : null,
          content: receivedNotification.body != null
              ? Text(receivedNotification.body)
              : null,
          actions: [
            CupertinoDialogAction(
              isDefaultAction: true,
              child: Text('Ok'),
              onPressed: () async {
                Navigator.of(context, rootNavigator: true).pop();
                await Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) =>
                        LandingPage(selectedPage: 3),
                        //SecondScreen(receivedNotification.payload),
                  ),
                );
              },
            )
          ],
        ),
      );
    });
  }

  void _configureSelectNotificationSubject() {
    selectNotificationSubject.stream.listen((String payload) async {
      await Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => LandingPage(selectedPage: 3)),//SecondScreen(payload)),
      );
    });
  }

  @override
  void dispose() {
    didReceiveLocalNotificationSubject.close();
    selectNotificationSubject.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
   return MaterialApp(
     debugShowCheckedModeBanner: false,
      title: 'My first app',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: LandingPage(),
    );
  }
}

And inside rabbitmq.dart

class Rabbitmq {

  static Future getDelivery() async
  {
    var auth = await DBProvider.db.getAuth();

      print(hash);

      Client client = new Client(
        settings: ConnectionSettings(
          host: 'myhost',
          authProvider: AmqPlainAuthenticator('user', 'password')
        )
      );

      client
      .channel()
      .then((Channel channel) => channel.queue("queue", durable: true))
      .then((Queue queue) => queue.consume())
      .then((Consumer consumer) => consumer.listen((AmqpMessage message) async {

          Map messageBody = message.payloadAsJson;

          if(messageBody.containsKey('message') == true && messageBody.containsKey('from') == true)
          {
            await Rabbitmq()._showNotification(messageBody['message'], messageBody['from']);
          }

        })
      );
  }

  Future<void> _showNotification(String text, String from) async {

    var initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher');
    var initializationSettingsIOS = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS);

    FlutterLocalNotificationsPlugin().initialize(initializationSettings);
    
    final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

    var androidPlatformChannelSpecifics = AndroidNotificationDetails(
        'com.example.g2r_market/chat', 'Уведомления чата', 'Настройка уведомлений для чатов',
        importance: Importance.Max, priority: Priority.High, ticker: 'ticker'
    );

    var iOSPlatformChannelSpecifics = IOSNotificationDetails();

    var platformChannelSpecifics = NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);

    await flutterLocalNotificationsPlugin.show(   
        0, from, text, platformChannelSpecifics,
        payload: 'item x');
  }
}
0 Answers
Related