簡體   English   中英

flutter_background_service 沒有收到更新

[英]flutter_background_service not receiving updates

當從 FirebaseMessaging 接收數據通知時,我結合使用awesome_notificationsflutter_background_service來更新一些應用程序 state。 如 awesome_notifications 中所述,后台消息處理程序必須是頂級 function,因此我使用 flutter_background_service 將數據傳遞到主隔離和更新應用程序 state。

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,但從未收到更新。 它似乎也沒有出錯。 我在這里某處錯過了一步嗎?

我在顫動后台服務上遇到了同樣的問題。 我通過從回調中刪除 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'); }

希望對你有幫助,如有語法錯誤請見諒

你可以試試這個。

main(){
....
}
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);
}

@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 see this log in logcat
    if (kDebugMode) {
      // print('FLUTTER BACKGROUND SERVICE: ${deee.toString()}');
    }

    // 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(); // init shared preferences
    });
  }
...
...
...
ElevatedButton(onPressed:(){saveData('Your Updated data.');}....

這方面有什么進展嗎? 我遇到了類似的問題,但不是 Future,而是 Timer(不是 Periodic) - Timer 中的代碼不適用於 Service 實例......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM