刷新小部件,因为它们在可滚动列表中可见

时间:2020-08-16 15:00:08

标签: flutter dart

我正在设计一个在某种程度上类似于Facebook应用程序的应用程序。我要模拟的是他们如何处理首页中帖子的更新。

例如,说我向下滚动到朋友莉萨的帖子,她在一分钟前发布了该帖子。如果我只盯着屏幕看2分钟,它仍然会说它是1分钟前发布的。但是,如果我向下滚动到另一篇文章,然后立即滚动回到她的文章,它将正确地指出它是3分钟前发布的。

我想实现类似的目标,但是我不知道如何实现或搜索它。试想一下,当我滚动到服务器时正在打给服务器,一次只能看到1条完整的帖子。

2 个答案:

答案 0 :(得分:0)

我认为您需要每隔1分钟使用Timer.periodic进行设置状态...这样的事情 Flutter Countdown Timer

void startTimer() {
const oneMin = const Duration(Minute: 1);
_timer = new Timer.periodic(
oneMin,
(Timer timer) => setState(() {},), );
}

并在Init状态下调用此方法...此代码仅供参考,可能无法正常工作! ...链接示例更好。

答案 1 :(得分:0)

我不确定您使用的是哪个数据库,我从您的问题中了解的是您想从数据库中读取数据并在listview中始终显示它们。完整的代码here!通过@seanmavley

     StreamController _postsController;
     int count = 1;

 Future fetchPost([howMany = 5]) async {
final response = await http.get(
    'https://blog.khophi.co/wp-json/wp/v2/posts/?per_page=$howMany&context=embed');

if (response.statusCode == 200) {
  return json.decode(response.body);
} else {
  throw Exception('Failed to load post');
}
}

loadPosts() async {
fetchPost().then((res) async {
  _postsController.add(res);
  return res;
});
}

showSnack() {
return scaffoldKey.currentState.showSnackBar(
  SnackBar(
    content: Text('New content loaded'),
  ),
);
}

Future<Null> _handleRefresh() async {
count++;
print(count);
fetchPost(count * 5).then((res) async {
  _postsController.add(res);
  showSnack();
  return null;
});
}
  //inside the scaffold
  body: StreamBuilder(
    stream: _postsController.stream,
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      print('Has error: ${snapshot.hasError}');
      print('Has data: ${snapshot.hasData}');
      print('Snapshot Data ${snapshot.data}');

      if (snapshot.hasError) {
        return Text(snapshot.error);
      }

      if (snapshot.hasData) {
        return Column(
          children: <Widget>[
            Expanded(
              child: Scrollbar(
                child: RefreshIndicator(
                  onRefresh: _handleRefresh,
                  child: ListView.builder(
                    physics: const AlwaysScrollableScrollPhysics(),
                    itemCount: snapshot.data.length,
                    itemBuilder: (context, index) {
                      var post = snapshot.data[index];
                      return ListTile(
                        title: Text(post['title']['rendered']),
                        subtitle: Text(post['date']),
                      );
                    },
                  ),
                ),
              ),
            ),
          ],
        );
      }