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 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ć).
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].
runApp()
(na przykład podczas inicjalizacji wtyczki), musisz jawnie wywołaćWidgetsFlutterBinding.ensureInitialized()
pierwszy.