Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >颤振钩子和异步调用

颤振钩子和异步调用
EN

Stack Overflow用户
提问于 2021-04-03 14:43:57
回答 1查看 3.9K关注 0票数 1

前面有些问题。

我在我的应用程序中使用了颤振钩子,但是在尝试使用带有异步调用的钩子时却很困难。

例如,如何通过SharedPreferences (或任何其他带有钩子的异步数据)获得useMemoized?

代码语言:javascript
运行
AI代码解释
复制
SharedPreferences preferences = useMemoized(() async => await SharedPreferences.getInstance());

上面的代码不能工作,因为“参数类型‘未来函数()’不能分配给参数类型'SharedPreferences函数()‘”,但是如何完成呢?

我希望存储用于读取和写入值的SharedPreferences实例。

下面是一个如何完成工作的实际例子,但我想知道是否有更好的方法。

代码语言:javascript
运行
AI代码解释
复制
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;
              },
            ),
          ],
        ),
      ],
    );
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-03 15:39:52

我认为您当前的代码已经足够了,但是如果您想使用useMemoized,我建议您这样做。

代码语言:javascript
运行
AI代码解释
复制
final future = useMemoized(SharedPreferences.getInstance);
final snapshot = useFuture(future, initialData: null);

useEffect(() {
  final preferences = snapshot.data;
  if (preferences == null) {
    return;
  }
  preferences.getBool('');
}, [snapshot.data]);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66936499

复制
相关文章
如何优雅判断属性值为空
假设我们现在需要取出 a.b.c,但是并不清楚它们是否都存在,那么代码会写成这样:
前端达人
2019/12/24
4.2K0
如何优雅判断属性值为空
利用 for 循环计算 n! 的值
阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。 亦即n!=1×2×3×...×(n-1)×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。
Skykguj
2022/09/09
1.8K0
如何通过CM为HDFS启用Federation
本文主要讲述如何通过CM为HDFS启用Federation。如果你对HDFS的Federation不太了解或者想知道Federation能够解决什么问题的话,建议先阅读我之前写的这篇文章《HDFS Federation(联邦)简介》
Fayson
2018/09/29
2.3K0
爬虫 (十八) 如何通过反编译理解 for 循环 (十)
前面的基本运算符加减乘除等运算符内容,我们就不讲了,我觉得最应该讲讲就是 for 循环运算符这东西,真的是需要我们去好好探讨一下的,记得关注点赞哦,谢谢
公众号---人生代码
2020/01/14
1.8K0
爬虫 (十八) 如何通过反编译理解 for 循环 (十)
[编程] C语言循环结构计算π的值
分析:首先,系数为正数的项的分母是4n-3(n为正数项的项数),为负数的项的分母为4n-1(n为负数项的项数),即分母的变化规律是1、3、5、7...的奇数数列,则第n项的分母为2n-1,第10000项的分母为2*10000-1。
唯一Chat
2019/09/10
3.6K0
solidity智能合约如何判断mapping值为空
在Java这类编程语言中,我们可以获得Map里面的值然后与null或空来进行判断该key对应的值是否为空。可是在solidity中貌似并没有提供类似的判断。那么我们如果来进行mapping值的判断呢。
程序新视界
2019/08/01
4K0
如何通过三级缓存解决 Spring 循环依赖
这个其实是一个特别高频的面试题,松哥也一直很想和大家仔细来聊一聊这个话题,网上关于这块的文章很多,但是我一直觉得要把这个问题讲清楚还有点难度,今天我来试一试,看能不能和小伙伴们把这个问题梳理清楚。
江南一点雨
2023/09/09
3030
如何通过三级缓存解决 Spring 循环依赖
Spring如何通过三级缓存解决循环依赖
这个例子存在的问题:理论上spring创建A的时候依赖了B,然后spring就会去加载B,但是这个时候B又依赖了A,spring又去加载A,就会陷入一个死循环,但我们在实际使用spring的时候并没有出现这样的循环,这是因为spring设计之初就考虑了这个问题,那么spring是如何解决的呢?我们先要明确的是spring对循环依赖的处理有三种情况,分别为
诺浅
2020/08/19
1K0
通过代码实例说明如何化腐朽为优雅
​  最近我负责的活动促销系统中要在审批的时候增加计算参加活动的商品的毛利率的需求。但是我负责打辅助,主要是同事负责具体开发,我了解了他的实现方式思路以后,果断拒绝了,并给出了我的解决方案以及优点,他发现我的方案确实扩展性和可维护性更好以后就采用了,本文就来通过这个实例来说明如何让本腐朽的代码变得优雅起来。
阿豪聊干货
2018/08/09
3300
如何通过执行SQL为低代码项目提速?
见多了SQL为代码开发提速,那么当低代码遇到SQL会擦出怎样的火花呢?本文将低代码和SQL结合进行介绍,让大家了解如何通过执行SQL为低代码项目提速。
葡萄城控件
2022/10/04
1.4K0
如何通过执行SQL为低代码项目提速?
05 . Python入门值循环语句
程序一般情况下是按照顺序执行的 编程语言提供了各种控制结构,允许更复杂的执行路径 Python中的循环语句有for和while但没有do while
iginkgo18
2020/09/27
5360
05 . Python入门值循环语句
ArcMap将栅格0值设置为NoData值的方法
  本文介绍在ArcMap软件中,将栅格图层中的0值或其他指定数值作为NoData值的方法。
疯狂学习GIS
2023/06/26
9610
ArcMap将栅格0值设置为NoData值的方法
JavaScript 判断输入的值为数字
使用js自带全局函数isNaN(), isNaN()返回一个Boolean值,如下 :
Devops海洋的渔夫
2019/06/02
3.7K0
如何通过Cloudera Manager为Kafka启用Kerberos及使用
在CDH集群中启用了Kerberos认证,那么我们的Kafka集群能否与Kerberos认证服务集成呢?本篇文章主要讲述如何通过Cloudera Manager为Kafka集群启用Kerberos认证及客户端配置使用。
Fayson
2018/03/29
3.2K0
如何通过Cloudera Manager为Kafka启用Kerberos及使用
JavaScript 解析 XML 时如何通过名称直接取到值?
同级的Attribute,有没有办法通过类似于 getXXXByName("aa") 得到0, getXXXByName("bb") 得到1呢?
阿敏总司令
2019/02/28
7500
js 为 li 循环添加 class
前段时间有个小伙伴想在新闻列表页面的 ul 里面为每个 class 循环添加带 1  2  3  4的 class,正巧昨天做一个站也用到了类似 for 循环,现在分享出来,很多东西都是通用的。
Savalone
2020/01/06
9.9K0
Perl与数据库DBI快速入门
习惯在Windows下开发数据库、熟悉ADO、ADO.NET的朋友,一定对ADOConnection/ADODataSet/ADOTable等类耳熟能详。DBI的接口与之类似,但在操作方法上又有不同,对ADO熟悉的朋友不妨比较一下异同。一般来说,数据库操作由以下几个步骤组成一个常见的流程:
明哥的运维笔记
2019/01/30
1.3K0
python如何使用for循环_Python 中for循环的应用
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170074.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
7.5K0
点击加载更多

相似问题

以fetchall_arrayref为单位的foreach值

32

从ArrayRef[HashRef]强制使用ArrayRef[MyClass]

21

通过arrayref进行解析并添加到新的

22

ArrayRef的目的

11

两个HoA中的FInd重叠值

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档