【问题标题】:Flutter- How NOT to call the same Service over and over?Flutter-如何不一遍又一遍地调用同一个服务?
【发布时间】:2020-08-14 05:15:47
【问题描述】:

假设我的目标是向用户显示一个“无穷无尽”的推荐项目列表。

为此,我实现了一些非常昂贵的异步方法 getItemsFromServer(...)(在服务器使用、时间、电池等方面),并从服务器获取 100 个新项目(及其图像),并通过添加从服务器获取的项目来更新推荐项目屏幕的状态。

我的目标是仅当用户拥有少于 20 个他尚未查看的项目时才调用此函数。 问题是,如果我天真地编程,例如

if(itemsNotViewed<20){
getItemsFromServer(...)
}

在用户点击或查看某个新项目后,此异步方法将被调用大约 20 次... 在不影响用户体验的情况下,只调用一次方法并等待它完成,最原则的方法是什么?

【问题讨论】:

    标签: flutter async-await flutter-web


    【解决方案1】:

    future 对象本身对于记住某事是否正在发生非常有用。像这样的东西应该工作。理想情况下,您会将其放入从多个位置调用的函数中。

    class MyState ... {
    
      Future itemsBeingGotten;
    
    
      build() {
        ...
          onPress: () async {
            if (itemsBeingGotten == null && itemsNotViewed < 20) {
              try {
                itemsBeingGotten = getItemsFromServer()
                await itemsBeingGotten; 
              } finally {
                itemsBeingGotten = null;
              }
            }
          }
      }
    
    
    
    
    

    【讨论】:

    • 我想过类似的事情,我的问题是 - 这意味着我应该使用一些 lock() 机制,因为不同的线程同时访问/使用相同的资源 (itemsBeingGotten)。你认为这是一个问题吗?为什么?
    • 好消息:这不是问题!只有一个线程。 Dart 是单线程的。 Async 在一个事件循环中模拟多个任务。在您说await 之前,没有其他代码介于两者之间。我试图在我的这次谈话中详细解释它:youtu.be/vPHxckiSmKY?t=2348
    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 2023-03-09
    • 1970-01-01
    • 2019-04-16
    • 2015-07-15
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多