前面有些问题。
我在我的应用程序中使用了颤振钩子,但是在尝试使用带有异步调用的钩子时却很困难。
例如,如何通过SharedPreferences (或任何其他带有钩子的异步数据)获得useMemoized?
SharedPreferences preferences = useMemoized(() async => await SharedPreferences.getInstance());
上面的代码不能工作,因为“参数类型‘未来函数()’不能分配给参数类型'SharedPreferences函数()‘”,但是如何完成呢?
我希望存储用于读取和写入值的SharedPreferences实例。
下面是一个如何完成工作的实际例子,但我想知道是否有更好的方法。
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:location/location.dart';
import 'package:shared_preferences/shared_preferences.dart';
class LocationWidget extends HookWidget {
const LocationWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final Location location = useMemoized(() => Location());
final ValueNotifier<bool> isLocationEnabled = useState(false);
final ValueNotifier<bool> isServiceEnabled = useState(false);
final ValueNotifier<PermissionStatus> permissionStatus = useState(PermissionStatus.denied);
useEffect(() {
Future<void>.microtask(() async {
final SharedPreferences preferences = await SharedPreferences.getInstance();
isLocationEnabled.value = preferences.getBool('trackingEnabled') ?? false;
isServiceEnabled.value = await location.serviceEnabled();
permissionStatus.value = await location.hasPermission();
});
}, <Location>[location]);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'Location',
style: Theme.of(context).textTheme.headline6,
),
const SizedBox(height: 5.0),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
const Text('Tracking service'),
Switch(
value: isLocationEnabled.value,
activeTrackColor: Colors.amberAccent,
activeColor: Colors.amber,
onChanged: (bool value) async {
if (value) {
if (permissionStatus.value == PermissionStatus.denied) {
permissionStatus.value = await location.requestPermission();
}
if (permissionStatus.value == PermissionStatus.granted) {
if (!isServiceEnabled.value) {
isServiceEnabled.value = await location.requestService();
}
value = isServiceEnabled.value ? value : !value;
}
}
final SharedPreferences preferences = await SharedPreferences.getInstance();
preferences.setBool('trackingEnabled', value);
isLocationEnabled.value = value;
},
),
],
),
],
);
}
}
发布于 2021-04-03 15:39:52
我认为您当前的代码已经足够了,但是如果您想使用useMemoized
,我建议您这样做。
final future = useMemoized(SharedPreferences.getInstance);
final snapshot = useFuture(future, initialData: null);
useEffect(() {
final preferences = snapshot.data;
if (preferences == null) {
return;
}
preferences.getBool('');
}, [snapshot.data]);
https://stackoverflow.com/questions/66936499
复制