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 只包含 getValue
和 setValue
,它们总是打开配置单元框,然后应该设置或获取值。此外,我创建了枚举 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));
}
我决定使用 hive 作为我的 settings/preference 存储。但是,我无法正确实现 Storage
class,因为 getValue
方法总是 returns Instance of 'Future<dynamic>'
而不是实际值。有谁知道如何解决这个问题?
我的 Storage
class 只包含 getValue
和 setValue
,它们总是打开配置单元框,然后应该设置或获取值。此外,我创建了枚举 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));
}