当前位置: 首页 > 知识库问答 >
问题:

有没有办法在InitState方法上加载异步数据?

喻珂
2023-03-14

我正在寻找一种在InitState方法上加载异步数据的方法,在构建方法运行之前,我需要一些数据。我使用的是GoogleAuth代码,我需要执行build方法,直到流运行为止。

我的initState方法是:

 @override
  void initState () {
    super.initState();
    _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account)     {
      setState(() {
        _currentUser = account;
      });
    });
    _googleSignIn.signInSilently();
  }

如有任何反馈,我将不胜感激。

共有3个答案

太叔志尚
2023-03-14

方法1:可以使用StreamBuilder执行此操作。这将在流中的数据发生更改时运行builder方法。

下面是我的一个示例项目的代码片段:

StreamBuilder<List<Content>> _getContentsList(BuildContext context) {
    final BlocProvider blocProvider = BlocProvider.of(context);
    int page = 1;
    return StreamBuilder<List<Content>>(
        stream: blocProvider.contentBloc.contents,
        initialData: [],
        builder: (context, snapshot) {
          if (snapshot.data.isNotEmpty) {
            return ListView.builder(itemBuilder: (context, index) {
              if (index < snapshot.data.length) {
                return ContentBox(content: snapshot.data.elementAt(index));
              } else if (index / 5 == page) {
                page++;
                blocProvider.contentBloc.index.add(index);
              }
            });
          } else {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
        });
  }

在上面的代码中,StreamBuilder侦听内容的任何更改,最初它是一个空数组并显示CircularProgressIndex。一旦我调用API,获取的数据就会添加到内容数组中,这将运行构建器方法。

用户向下滚动时,会获取更多内容并将其添加到内容数组中,该数组将再次运行builder方法。

在您的情况下,只需要初始加载。但这为您提供了在获取数据之前在屏幕上显示其他内容的选项。

希望这是有帮助的。

编辑:

在您的情况下,我猜它将如下所示:

StreamBuilder<List<Content>>(
        stream: account, // stream data to listen for change
        builder: (context, snapshot) {
            if(account != null) {
                return _googleSignIn.signInSilently();
            } else {
                // show loader or animation
            }
        });

方法2:另一种方法是创建一个async方法,并从initState()调用它,如下所示:

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

  void asyncMethod() async {
    await asyncCall1();
    await asyncCall2();
    // ....
  }

乔望
2023-03-14

从现在起,请使用。然后,符号似乎起作用了:

  // ...
  @override
  initState() {
    super.initState();
    myAsyncFunction
    // as suggested in the comment
    // .whenComplete() {
    // or
      .then((result) {
    print("result: $result");
    setState(() {});
    });
  }
  //...

艾宁
2023-03-14

您可以创建一个async方法并在您的initState中调用它

@override
void initState () {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_){
    _asyncMethod();
  });
        
}

_asyncMethod() async {
  _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account)     {
    setState(() {
      _currentUser = account;
    });
  });
  _googleSignIn.signInSilently();
}
 类似资料:
  • 问题内容: 有没有办法用TypeScript语言进行方法重载? 我想实现以下目标: 这是我不想做的一个例子(我真的很讨厌JS中重载hack的那一部分): 问题答案: 根据规范,TypeScript确实支持方法重载,但是它很笨拙,并且包含许多手动检查参数类型的工作。我认为这主要是因为在纯JavaScript中最接近方法重载的地方还包括检查,并且TypeScript尝试不修改实际的方法主体,以避免任何

  • 没有await并且在非异步方法中调用异步方法的行为是什么?我这样问是因为我看到Visual Studio在调用异步方法时没有显示任何警告,好像这是一件非常正常的事情。在这种情况下,异步方法的行为是否像是同步的?

  • 问题内容: 我想知道是否有办法限制cassandra java驱动程序同时执行的查询数量? 当前,我执行许多查询,如下所示: 不幸的是,这可能导致NoHostAvailableException。 谢谢。 问题答案: 您可以使用信号量来限制并发查询的数量: 但是到最后,情况并没有太大的不同:信号量将阻塞(如果使用定时版本的Acquisition,则抛出该信号),而不是在超出容量时得到信号。因此,您

  • 有没有办法(一步一步)在M1 Mac上设置PyCharm?我正在寻找一些一步一步地如何克服口译员的错误。还有一个错误消息发生在我的简单Hello world打印中。 “进程结束,退出代码137(被信号9:SIGKILL中断)”

  • 我有一个PDF文件,里面有海量的xmp元数据,当我用itext7处理它的时候,程序卡在语句查看源代码,发现在Pdffile对象的构造函数中执行了open(null)方法,最后卡在了并且没有避免它的选项,xmp元数据对我来说毫无用处。 有了itextSharp,基于PDF/A上的删除XMP元数据,我可以得到一个没有元数据的pdf文件。 我试图创建PdfReader或PdfDocument的子类,试图

  • 问题内容: 我们正在开发S60版本,该平台具有不错的Python API。 但是,关于Android上的Python尚无任何官方资料,但是由于Jython存在,有没有办法让蛇和机器人一起工作? 问题答案: 一种方法是使用: 开源Python库,用于快速开发利用创新用户界面的应用程序,例如多点触控应用程序。 可在和上运行。你可以在所有受支持的平台上运行相同的代码。