Pracuję nad flutterową aplikacją, która musi pobierać i aktualizować moją bazę danych sqlite w tle. Aby to osiągnąć, próbuję skonfigurować i używać wtyczki workmanager dostarczanej przez flutter. Ale za każdym razem, gdy działa w tle, wyświetla komunikat „Niestety, moja aplikacja się zatrzymała”.

Oto mój main.dart

void callbackDispatcher() {
  Workmanager.executeTask((task, inputData){
    try {
      var connectivityResult = await (Connectivity().checkConnectivity());
      final result = await InternetAddress.lookup('google.com');
      if (connectivityResult == ConnectivityResult.mobile) {
        // I am connected to a mobile network.
        if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
          print('connected');
        }
      } else if (connectivityResult == ConnectivityResult.wifi) {
        // I am connected to a wifi network.
        if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
          print('connected');
        }
      }
    } on SocketException catch (_) {
      print('not connected');
    }
    return Future.value(true);
  });
}

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Workmanager.initialize(
      callbackDispatcher, // The top level function, aka callbackDispatcher
      isInDebugMode: 
          false // If enabled it will post a notification whenever the task is running. Handy for debugging tasks
      );
  // Periodic task registration
  Workmanager.registerPeriodicTask("2", "syncfirebase",
      // When no frequency is provided the default 15 minutes is set.
      // Minimum frequency is 15 min. Android will automatically change your frequency to 15 min if you have configured a lower frequency.
      frequency: Duration(minutes: 15),
      initialDelay: Duration(seconds: 10),
      constraints: Constraints(networkType: NetworkType.connected));

  runApp(new MyApp());
}
1
Muhwezi Jerald basasa 19 grudzień 2019, 14:23
Pobiera również ten błąd podczas początkowej instalacji aplikacji. E/flutter (186969): [BŁĄD:flutter/lib/ui/ui_dart_state.cc(157)] Nieobsługiwany wyjątek: ServicesBinding.defaultBinaryMessenger uzyskano dostęp przed zainicjowaniem powiązania. E/flutter (18969): Jeśli używasz aplikacji i chcesz uzyskać dostęp do komunikatora binarnego przed wywołaniem runApp() (na przykład podczas inicjalizacji wtyczki), musisz jawnie wywołać WidgetsFlutterBinding.ensureInitialized() pierwszy.
 – 
Muhwezi Jerald basasa
19 grudzień 2019, 14:28

1 odpowiedź

Gdybym miał zgadywać, brakuje Ci połączenia z WidgetsFlutterBinding.ensureInitialized() w callbackDispatcher. callbackDispatcher jest punktem wejściowym dla izolatu tła (efektywnie wątku Dart), który WorkManager się pojawia, więc będziesz musiał ponownie zainicjować WidgetsFlutterBinding (powinno to być naprawdę zrobione przez wtyczkę, ale nie wygląda na to, że autor zdecydował się to zrobić).

-1
Ben Konyi 21 grudzień 2019, 03:11