Hive for flutter 只是 returns 实例而不是实际值

Hive for flutter just returns the Instance instead of the actual value

我决定使用 hive 作为我的 settings/preference 存储。但是,我无法正确实现 Storage class,因为 getValue 方法总是 returns Instance of 'Future<dynamic>' 而不是实际值。有谁知道如何解决这个问题?

我的 Storage class 只包含 getValuesetValue,它们总是打开配置单元框,然后应该设置或获取值。此外,我创建了枚举 StorageKeys 以便拥有一组键并确保我获取或将值设置为专用键。

main.dart

void main() async {

  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();

  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    routes: {
      "/": (context) => const Home(),
    },
  ));
}

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  get() async {
    return await Storage.getValue(StorageKeys.authTokenKey);
  }

  void set() async {
    await Storage.setValue(StorageKeys.authTokenKey, 'TestValue');
  }

  @override
  Widget build(BuildContext context) {
    set();
    print(get());

    return Scaffold(
      backgroundColor: Colors.white,
      appBar: ChevronNavigation(),
      body: Container(),
    );
  }
}

storage.dart

class Storage {
  static const preferencesBox = '_storageBox';

  static Future<void> setValue(StorageKeys key, dynamic value) async {
    final storage = await Hive.openBox<dynamic>(preferencesBox);
    storage.put(key.toString(), value);
  }

  static dynamic getValue(StorageKeys key) async {
    final storage = await Hive.openBox<dynamic>(preferencesBox);
    return await storage.get(key.toString(), defaultValue: null) as dynamic;
  }
}

enum StorageKeys {
  authTokenKey,
}

print(get()); 会给你 Instance of Future<dynamic> 因为 get() returns 一个 Future 对象。

解决方案:

您需要通过在 Future 方法中的 get() 之前写入 await 来等待 Future 对象中的实际值。

像这样:

print(await get());

在你上面的问题中,这不能工作,因为构建方法不能是异步的。您可以将 print(await get()) 放在单独的方法中,然后将其放入 initState.

像这样:

 @override
  void initState() {
    super.initState();
    callGet();
  }

  Future<void> callGet() async {
    print(await get());
  }

您正在打印 await Storage.getValue(StorageKeys.authTokenKey); 值,因为它是 Future,您会收到此消息。

您应该尝试在您的 initState 上调用它,然后获取 Hive 值。当值 returns 你不能打印它。

例如:

  @override
  void initState() {
    super.initState();
    Storage.getValue(StorageKeys.authTokenKey).then((value) => print(value));
  }