页面刷新

// 话题列表页

import 'dart:async';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_app/generated/i18n.dart';
import 'package:flutter_app/models/web/item_tab_topic.dart';
import 'package:flutter_app/network/dio_web.dart';
import 'package:flutter_app/pages/page_profile.dart';
import 'package:flutter_app/pages/page_topic_detail.dart';
import 'package:flutter_app/utils/utils.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:ovprogresshud/progresshud.dart';
import 'package:shimmer/shimmer.dart';

import 'circle_avatar.dart';

class TopicListView extends StatefulWidget {
  final String tabKey;

  TopicListView(this.tabKey);

  @override
  State<StatefulWidget> createState() => new TopicListViewState();
}

class TopicListViewState extends State<TopicListView> with AutomaticKeepAliveClientMixin {
  Future<List<TabTopicItem>> topicListFuture;

  ScrollController _scrollController = ScrollController();

  @override
  void initState() {
    super.initState();
    // 获取数据
    topicListFuture = getTopics();
    _scrollController.addListener(() {
      if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {
        HapticFeedback.heavyImpact(); // 震动反馈(暗示已经滑到底部了)
      }
    });
  }

  Future<List<TabTopicItem>> getTopics() async {
    return await DioWeb.getTopicsByTabKey(widget.tabKey, 0);
  }

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return new FutureBuilder<List<TabTopicItem>>(
        future: topicListFuture,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return RefreshIndicator(
                child: snapshot.data.length > 0
                    ? ListView.builder(
                        // primary: false,  // 这样会导致 iOS 上点击状态栏没办法滑到顶部
                        controller: _scrollController,
                        physics: ClampingScrollPhysics(), // iOS 上默认是 BouncingScrollPhysics,体验和下拉刷新有点冲突
                        itemBuilder: (context, index) => TopicItemView(snapshot.data[index]),
                        itemCount: snapshot.data.length)
                    : Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                          Text('暂无数据'),
                        ],
                      ),
                onRefresh: () {
                  // https://stackoverflow.com/questions/51775098/how-do-i-use-refreshindicator-with-a-futurebuilder-in-flutter
                  setState(() {
                    topicListFuture = getTopics();
                  });
                  return topicListFuture;
                });
          } else if (snapshot.hasError) {
            print("wmllll:${snapshot.error}");
            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(S.of(context).oops),
                RaisedButton.icon(
                  onPressed: () {
                    Progresshud.show();
                    _onRefresh().then((_) => Progresshud.dismiss());
                  },
                  icon: Icon(Icons.refresh),
                  label: Text(S.of(context).retry),
                )
              ],
            );
          }
          // By default, show a loading skeleton
          return LoadingList();
        });
  }

  //刷新数据,重新设置future就行了
  Future _onRefresh() async {
    await Future.delayed(Duration(seconds: 1), () {
      setState(() {
        topicListFuture = getTopics();
      });
    });
  }

  @override
  void dispose() {
    super.dispose();
    _scrollController.dispose();
  }

  @override
  bool get wantKeepAlive => true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值