flutter Hive数据库无法脱机工作,但连接到Internet时工作正常

ibrsph3r  于 2023-06-24  发布在  Flutter
关注(0)|答案(1)|浏览(114)

我正在开发一个Flutter应用程序,我正在实现Hive数据库缓存数据。我已经添加了两个hiveand hive_flutter包。我从API获取数据并将其存储到Hive以更新数据,当我使用连接到互联网的应用程序时,它工作正常,但当我尝试在离线时阅读时,它不起作用。下面是我调用来获取数据的API方法的代码:

static Future<List<UserPost>> getPosts() async {
    //I call my API in try block, if its successful, I update the data in hive
    List<UserPost> posts = [];
    Hive.openBox(Constants.APIDATA_BOX);
    try {
      var response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'),);
    if (response.statusCode == 200) {
      //Clear hive box from old data
      Hive.box(Constants.APIDATA_BOX).clear();
      Hive.box(Constants.APIDATA_BOX).put(Constants.API_DATA,jsonDecode(response.body));
    }
    } catch (e) {
      print('You are not connected to internet');
    }
    //I am getting data here from hive database and it works fine while connected to internet
    var listMaps =await Hive.box(Constants.APIDATA_BOX).get(Constants.API_DATA, defaultValue: []);
    posts = listMaps.map<UserPost>((map) {
       //Here flow stucked whenever working offline,
       //Data is also available but here conversion cause error, I have tried many way but fails.
       return UserPost.fromMap(map);
      }).toList();
  return posts;
  }

我不知道为什么我得到错误,我已经尝试了许多转换方式在这里,但所有的作品,而在线。任何帮助都将受到高度赞赏。

yqkkidmi

yqkkidmi1#

我想我已经理解了这个错误,但是你应该更好地解释你遇到的是哪种类型的错误。无论如何,请注意Hive上的操作,这些操作通常是异步的,例如Hive.openBox(Constants.APIDATA_BOX);
所以当你有互联网连接时,你必须等待响应,Hive有时间打开盒子,否则它会抛出错误,所以,考虑到未来,你应该这样做:

static Future<List<UserPost>> getPosts() async {
    List<UserPost> posts = [];
    await Hive.openBox(Constants.APIDATA_BOX);
    try {
      var response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'),);
    if (response.statusCode == 200) {
      //Clear hive box from old data
      await Hive.box(Constants.APIDATA_BOX).clear();
      await Hive.box(Constants.APIDATA_BOX).put(Constants.API_DATA,jsonDecode(response.body));
    }
    } catch (e) {
      print('You are not connected to internet');
    }
    var listMaps = await Hive.box(Constants.APIDATA_BOX).get(Constants.API_DATA, defaultValue: []);
    posts = listMaps.map<UserPost>((map) {
       return UserPost.fromMap(map);
      }).toList();
    return posts;
  }

请注意,普通框中的await Hive.put()并不是严格必需的,如文档中所述

相关问题