gpt4 book ai didi

dart - 那么在 Flutter 中缓存最简单的方法是什么?

转载 作者:IT老高 更新时间:2023-10-28 12:45:54 29 4
gpt4 key购买 nike

该应用程序是一个简单的新闻阅读器,它显示 WordPress 帖子,没有什么花哨的,不使用 BLOC,继承的 Widget,Firebase。即使用户离线,我也希望它显示缓存的数据(即最新的 10 个帖子)。

所以如果用户离线显示缓存数据;或者不知何故默认数据是缓存数据。

从 WP REST API 获取 firstPost[Id]如果缓存的 Json 文件包含 Post[id] 则显示缓存的数据;否则 getPosts();并显示加载指示器。还请更新本地 JSON 文件。

获取 JSON 数据的代码:

// Function to fetch list of posts
Future<String> getPosts() async {
var res = await http
.get(Uri.encodeFull(apiUrl + "posts?_embed&per_page=10"), //TODO make it unlimited
headers: {"Accept": "application/json"});

setState(() {
var resBody = json.decode(res.body);

posts = resBody;
});

return "Success!";
}

future 获取帖子并显示加载指示器:

  body: FutureBuilder<List<String>>(
future: getPosts(),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);

return snapshot.hasData
? ListViewPosts(posts: snapshot.data)
: Center(child: CircularProgressIndicator());
},
),

最佳答案

简单的基于时间的缓存不需要太多代码。

这可能会对您有所帮助。它使用 ScopedModel,但它也可以很容易地成为一个简单的类,尽管您必须删除 notifyListeners() 调用或将其替换为您自己的机制,如果您希望模型触发 UI 的刷新。

class MyModel extends Model{
Duration _cacheValidDuration;
DateTime _lastFetchTime;
List<MyRecord> _allRecords;



MyModel(){
_cacheValidDuration = Duration(minutes: 30);
_lastFetchTime = DateTime.fromMillisecondsSinceEpoch(0);
_allRecords = [];
}



/// Refreshes all records from the API, replacing the ones that are in the cache.
/// Notifies listeners if notifyListeners is true.
Future<void> refreshAllRecords(bool notifyListeners) async{
_allRecords = await MyApi.getAllRecords(); // This makes the actual HTTP request
_lastFetchTime = DateTime.now();
if( notifyListeners ) this.notifyListeners();
}


/// If the cache time has expired, or forceRefresh is true, records are refreshed from the API before being returned.
/// Otherwise the cached records are returned.
Future<List<MyRecord>> getAllRecords({bool forceRefresh = false}) async{
bool shouldRefreshFromApi = (null == _allRecords || _allRecords.isEmpty || null == _lastFetchTime || _lastFetchTime.isBefore(DateTime.now().subtract(_cacheValidDuration)) || forceRefresh);

if( shouldRefreshFromApi )
await refreshAllRecords(false);

return _allRecords;
}
}

要从 MyModel 获取数据,UI 只需调用 getAllRecords()。这将从内存中获取记录(即从 _allRecords)或触发刷新,从而进行 HTTP 调用并更新记录。缓存数据30分钟后自动过期,如果要强制刷新(比如用户明确点击刷新按钮),可以通过forceRefresh: true

关于dart - 那么在 Flutter 中缓存最简单的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53459669/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com