flutter_background_service 未接收更新

问题描述 投票:0回答:3

我正在结合使用 awesome_notificationsflutter_background_service 在从 FirebaseMessaging 接收数据通知时更新某些应用程序状态。正如 Awesome_notifications 中所述,后台消息处理程序必须是顶级函数,因此我使用 flutter_background_service 将数据传递到主隔离并更新应用程序状态。

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await initializeBackgroundService();
  FirebaseMessaging.onBackgroundMessage(_backgroundMessageHandler);
  _initLocalNotifications();
  runApp(MyApp());
}

我正在初始化后台服务,类似于 flutter_background_service 中的示例:

Future<void> initializeBackgroundService() async {
  final service = FlutterBackgroundService();
  await service.configure(
    androidConfiguration: AndroidConfiguration(
      onStart: onStart,
      autoStart: true,
      isForegroundMode: true,
    ),
    iosConfiguration: IosConfiguration(
      autoStart: true,
      onForeground: onStart,
      onBackground: onIosBackground,
    ),
  );
  await service.startService();
}

并在收到通知时调用 _backgroundMessageHandler 中的更新:

Future<void> _backgroundMessageHandler(
  RemoteMessage message,
) async {
  final service = FlutterBackgroundService();

  ...

  service.invoke('update', {
    'key1': 'val1',
    'key2': 'val2',
  });
}

在主隔离区中我的应用程序的 StatefulWidget 中,我正在监听更新调用以接收数据:

void listenForNotificationData() {
  final backgroundService = FlutterBackgroundService();
  backgroundService.on('update').listen((event) async {
    print('received data message in feed: $event');
  }, onError: (e, s) {
    print('error listening for updates: $e, $s');
  }, onDone: () {
    print('background listen closed');
  });
}

它永远不会调用“更新”事件的监听回调。我可以确认它正在调用 invoke('update') 部分并调用 on('update').listen,但从未收到更新。它似乎也没有出错。我在这里错过了某个步骤吗?

flutter dart background-process dart-isolates awesome-notifications
3个回答
2
投票

我在 flutter 后台服务上遇到了同样的问题。我通过从回调中删除 async 关键字并创建一个单独的异步函数来执行回调操作来解决这个问题。

void listenForNotificationData() {
  final backgroundService = FlutterBackgroundService();
  backgroundService.on('update').listen((event) {
    print('received data message in feed: $event');
  }, onError: (e, s) {
    print('error listening for updates: $e, $s');
  }, onDone: () {
    print('background listen closed');
  });
}

void action(Map? event) async {
print('received data message in feed: $event');
}

希望有帮助,如有语法错误请原谅


0
投票

首先创建一个新类。

class ProjectBackgroundService{}

现在让我们定义您将在此类中使用的函数。

第一个是 readyForShared() 函数。这个函数允许我们定义和读取局部变量。

`Future<void> readyForShared() async {
   var sharedPreferences = await SharedPreferences.getInstance();
   counterValue = sharedPreferences.getString("yourVariable") ??"0";
 }`

现在让我们编写保存局部变量的函数。

Future<void> saveData(String value) async {
  var sharedPreferences = await SharedPreferences.getInstance();
  sharedPreferences.setString("yourVariable", value);
}

现在让我们编写您的服务函数onStart()

@pragma('vm:entry-point')
void onStart(ServiceInstance service) async {

  // Only available for flutter 3.0.0 and later
  DartPluginRegistrant.ensureInitialized();

  // For flutter prior to version 3.0.0
  // We have to register the plugin manually

  SharedPreferences preferences = await SharedPreferences.getInstance();
  await preferences.setString("hello", "world");

  /// OPTIONAL when use custom notification
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

  if (service is AndroidServiceInstance) {
    service.on('setAsForeground').listen((event) {
      service.setAsForegroundService();
    });

    service.on('setAsBackground').listen((event) {
      service.setAsBackgroundService();
    });
  }

  service.on('stopService').listen((event) {
    service.stopSelf();
  });
    
  // bring to foreground
  Timer.periodic(const Duration(seconds: 1), (timer) async {
    final receivePort = ReceivePort();
    // here we are passing method name and sendPort instance from ReceivePort as listener
    await Isolate.spawn(computationallyExpensiveTask, receivePort.sendPort);

    if (service is AndroidServiceInstance) {
      if (await service.isForegroundService()) {
        //It will listen for isolate function to finish
         receivePort.listen((sum) {
         flutterLocalNotificationsPlugin.show(
         888,
         'Title',
         'Description ${DateTime.now()}',
         const NotificationDetails(
         android: AndroidNotificationDetails(
         'my_foreground',
         'MY FOREGROUND SERVICE',
         icon: 'ic_bg_service_small',
         ongoing: true,
         ),
         ),
         );
         });

        var sharedPreferences = await SharedPreferences.getInstance();
        await sharedPreferences.reload(); // Its important
        service.setForegroundNotificationInfo(
          title: "My App Service",
          content: "Updated at ${sharedPreferences.getString("yourVariable") ?? 'no data'}",
        );
      }
    }


    /// you can print
    //if (kDebugMode) {
    //}

    // test using external plugin
    final deviceInfo = DeviceInfoPlugin();
    String? device;
    if (Platform.isAndroid) {
      final androidInfo = await deviceInfo.androidInfo;
      device = androidInfo.model;
    }

    if (Platform.isIOS) {
      final iosInfo = await deviceInfo.iosInfo;
      device = iosInfo.model;
    }
    service.invoke(
      'update',
      {
        "current_date": '400',
        "device": device,
      },
    );
  });
}

现在让我们致电我们的服务

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
      readyForShared();
      ProjectBackgroundService().onStart();
    });
  }

0
投票

您的问题解决了吗? @cpf5193

© www.soinside.com 2019 - 2024. All rights reserved.