如何在flutter中使用hive和workmanager?

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

在应用程序后台状态下,我想从API获取一些数据然后将它们存储到Hive数据库中。为了在后台运行任务,我使用 workmanager 包并添加了必要的代码来从 API 获取数据并将其保存到 Hive 数据库中。 但它每次都会返回错误。

LateInitializationError: Field '_my_hive_Box@66472566' has not been initialized.

这表示我的蜂巢盒未初始化。但我在 main()

中初始化它们

有什么办法可以解决这个hive box初始化问题吗?

class MyHive {
  // prevent making instance
  MyHive._();

  // hive box to store Client user  data
  static late Box<SellClientSyncModel> _clientBox;

  // store current user as (key => value)
  static const String _currentUserKey = 'local_user';

  /// initialize local db (HIVE)
  /// pass testPath only if you are testing hive
  static Future<void> init(
      {Function(HiveInterface)? registerAdapters, String? testPath}) async {
    if (testPath != null) {
      Hive.init(testPath);
    } else {
      await Hive.initFlutter();
    }
    await registerAdapters?.call(Hive);
    await initUserBox();
  }

  /// initialize user box
  static Future<void> initUserBox() async {
    _clientBox = await Hive.openBox(AppConstant.clientBoxHive);
  }

  /// Client Methods
  static Future<bool> saveClientToHive(SellClientSyncModel user) async {
    try {
      await _clientBox.put(_currentUserKey, user);
      return true;
    } catch (error) {
      print(error);
      return false;
    }
  }
}

在main()中

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // initialize hive for whole app
  await MyHive.init(registerAdapters: (hive) {
    hive.registerAdapter(SellClientAdapter());
  });

  runApp(child: MyApp());

}
flutter hive flutter-hive flutter-workmanager
1个回答
0
投票

检查这两个链接:
解决方案1
解决方案2

如果您不明白发送和接收端口。一种非常简单的方法是加载传入的 API 响应并将其保存到 response.txt 文件中。然后你可以将这些本地响应提取到对象中。

这是保存在本地.txt文件中的方法

void saveResponseToJsonFile(dynamic data) async {
    // Define the file path (ensure the path exists)
    Directory directory = await getApplicationDocumentsDirectory();
    String filePath = '${directory.path}/response.txt';

    File file = File(filePath);

    // Write the JSON string to the file
    await file.writeAsString(data.toString());
    
  }

必须使用path_provider包..

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