为什么Flutter Workmanager显示错误:“无法解决主入口点函数”和多个Flutterjni警告?

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

我正在尝试在我的Flutter应用中实现背景任务,以在使用Workmanager在线时添加用户在线数据库。但是,在启动工人管理器并运行应用程序后,我在日志中遇到了此错误:

Software配置:

Java:17.0.11
扑来:3.29.0
Android Studio:2024.2.1补丁3

Error日志:

: FlutterJNI.loadLibrary called more than once I/ResourceExtractor(13363): Found extracted resources res_timestamp-1-1741615888564 W/FlutterJNI(13363): FlutterJNI.prefetchDefaultFontManager called more than once W/FlutterJNI(13363): FlutterJNI.init called more than once E/flutter (13363): [ERROR:flutter/runtime/dart_isolate.cc(869)] Could not resolve main entrypoint function. E/flutter (13363): [ERROR:flutter/runtime/dart_isolate.cc(170)] Could not run the run main Dart entrypoint. E/flutter (13363): [ERROR:flutter/runtime/runtime_controller.cc(557)] Could not create root isolate. E/flutter (13363): [ERROR:flutter/shell/common/shell.cc(668)] Could not launch engine with configuration. I/Choreographer(13363): Skipped 74 frames! The application may be doing too much work on its main thread. I/flutter (13363): Initializing WorkManager... I/flutter (13363): WorkManager initialized successfully. I/flutter (13363): 📂 List of Databases: I/flutter (13363): 📌 Database Found: /data/user/0/com.example.test_app/app_flutter/app.db I/flutter (13363): Users in database: I/flutter (13363): ID: 1, Name: raj, Job: worker, Synced: false I/flutter (13363): ID: 2, Name: robjn, Job: seeker, Synced: false I/flutter (13363): ID: 3, Name: Raj, Job: Engineer, Synced: false I/flutter (13363): ID: 4, Name: Raj, Job: Engineer, Synced: false I/flutter (13363): ID: 5, Name: Raj, Job: Engineer, Synced: false I/flutter (13363): ID: 6, Name: Raj, Job: Engineer, Synced: false I/flutter (13363): ID: 7, Name: Raj, Job: Engineer, Synced: false I/flutter (13363): ID: 8, Name: Raj, Job: Engineer, Synced: false I/flutter (13363): ID: 9, Name: Ravi, Job: Tailor, Synced: false I/flutter (13363): ID: 10, Name: Ragul, Job: Sailor, Synced: false
我的代码是我的代码:

main.dart

void main() async { WidgetsFlutterBinding.ensureInitialized(); await WorkManagerService.initialize(); final database = AppDatabase(); await database.listAllDatabases(); final users = await database.getAllUsers(); print("Users in database:"); for (var user in users) { print( "ID: ${user.id}, Name: ${user.name}, Job: ${user.job}, Synced: ${user.isSynced}"); } runApp(const ProviderScope(child: MyApp())); }

testadDuserProvider.dart

final addTestUserProvider = StateNotifierProvider<AddTestUserProvider, AsyncValue<User?>>((ref) { final database = ref.watch(databaseProvider); return AddTestUserProvider(database); }); class AddTestUserProvider extends StateNotifier<AsyncValue<User?>> { final AppDatabase _database; AddTestUserProvider(this._database) : super(const AsyncValue.data(null)); Future<void> addUser(String name, String job, bool bool) async { state = const AsyncValue.loading(); print("offline"); await _addUserOffline(name, job); } Future<void> _addUserOffline(String name, String job) async { try { final newUser = UsersCompanion( name: Value(name), job: Value(job), isSynced: const Value(false), ); await _database.insertUser(newUser); WorkManagerService.registerSyncTask(); state = const AsyncValue.data(null); } catch (e, stackTrace) { state = AsyncValue.error(e, stackTrace); } } }

Work_manager.dart

import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:workmanager/workmanager.dart'; import '../data/providers/user_provider.dart'; import '../database/app_database.dart'; import '../utils/constants.dart'; import 'api_service.dart'; import 'network_service.dart'; const String syncTask = "sync_offline_users"; class WorkManagerService { static Future<void> initialize() async { print("Initializing WorkManager..."); Workmanager().initialize( _callbackDispatcher, isInDebugMode: true, ); print("WorkManager initialized successfully."); } static void registerSyncTask() { print("Registering sync task..."); Workmanager().registerOneOffTask( "sync_users_task", syncTask, constraints: Constraints( networkType: NetworkType.connected, ), ); print("Sync task registered successfully."); } @pragma('vm:entry-point') static void _callbackDispatcher() { Workmanager().executeTask((task, inputData) async { print("Executing task: $task"); final container = ProviderContainer(); try { final database = container.read(databaseProvider); final apiService = container.read(apiServiceProvider); final isConnected = container.read(connectivityServiceProvider).isConnectedSync(); if (task == syncTask && isConnected) { await _syncOfflineUsers(database, apiService); } } catch (e) { print("Error in callback dispatcher: $e"); } finally { container.dispose(); } return Future.value(true); }); } static Future<void> _syncOfflineUsers( AppDatabase database, ApiService apiService) async { print("Starting to sync offline users..."); final unsyncedUsers = await database.getUnsyncedUsers(); print("Fetched ${unsyncedUsers.length} unsynced users."); for (var user in unsyncedUsers) { print("Syncing user: ${user.name} (ID: ${user.id})"); try { final response = await apiService.post( addUsersEndpoint, body: {"name": user.name, "job": user.job}, ); print("API response received: $response"); if (response != null && response['id'] != null) { print( "User ${user.name} synced successfully with ID: ${response['id']}"); await database.markUserAsSynced(user.id, response['id']); print("User marked as synced in the database."); } else { print( "API response is null or missing ID. Sync failed for user ${user.id}."); } } catch (e) { print("Failed to sync user ${user.id}: $e"); } } print("Offline user sync completed."); } }

androidmanifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <meta-data android:name="flutterEmbedding" android:value="2" /> <service android:name="MyJobService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"> </service>

如果您想在自己的系统中运行此项目以进行详细分析。尝试此回购:


github

步骤:

使用test_screen.dart和test_provider用于重新创建此问题,我将逻辑分开以节省逻辑。

  1. 错误之所以发生错误,是因为Workmanager的背景回调函数必须是顶级函数,而不是类内部的静态方法 - 即使是用
  2. Could not resolve main entrypoint function
注释。在您的代码中,
java android flutter android-workmanager flutter-workmanager
1个回答
0
投票
被定义为

_callbackDispatcher

中的静态方法,尽管它标有适当的pragma,但Workmanager无法将其定位在后台隔离中。
要解决此问题,您需要移出课堂,并将其定义为文件中的独立顶级功能。这样,当背景隔离启动时,它可以可靠地查找并执行回调函数。通常,多种初始化调用(例如,当firbase.initializeapp被称为两次),是一个单独的问题。但是,通过使您的回调成为顶级功能来解决入口点问题,应消除可防止引擎在后台隔离中启动的致命错误。
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.