Flutter42.Opensource China New界面(14)

news_list_page.dart下拉刷新和加载更多

import 'dart:convert';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutterapp2/common/event_bus.dart';
import 'package:flutterapp2/constants/Constants.dart';
import 'package:flutterapp2/utils/data_utils.dart';
import 'package:flutterapp2/utils/net_utils.dart';
import 'package:flutterapp2/widgets/NewsListItem.dart';

import 'login_web_page.dart';

/**
 * 主界面News
 */
class NewsListPage extends StatefulWidget {
  @override
  _NewsListPageState createState() => _NewsListPageState();
}

class _NewsListPageState extends State<NewsListPage> {
  bool isLogin = false;
  int curPage = 1;//页数,加载更多的时候参数会改变
  List newsList;
  ScrollController _controller = ScrollController();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    //下拉的监听
    _controller.addListener(() {
      var maxScroll = _controller.position.maxScrollExtent;
      var pixels = _controller.position.pixels;
      if (maxScroll == pixels) {
        curPage++;
        getNewsList(true);
      }
    });
    //登录成功
    DataUtils.isLogin().then((isLogin) {
      if (!mounted) return;
      setState(() {
        this.isLogin = isLogin;
      });
    });
    //EventBus监听登录事件
    eventBus.on<LoginEvent>().listen((event) {
      if (!mounted) return;
      setState(() {
        this.isLogin = true;
      });
      //获取新闻列表
      getNewsList(false);
    });
    eventBus.on<LogoutEvent>().listen((event) {
      if (!mounted) return;
      setState(() {
        this.isLogin = false;
      });
    });
  }

  //NEWS_LIST
  getNewsList(bool isLoadMore) async {
    DataUtils.isLogin().then((isLogin) {
      if (isLogin) {
        DataUtils.getAccessToken().then((accessToken) {
          if (accessToken == null || accessToken.length == 0) {
            return;
          }
          Map<String, dynamic> params = Map<String, dynamic>();
          params['access_token'] = accessToken;
          params['catalog'] = 1;
          params['page'] = curPage;
          params['pageSize'] = 10;//每次刷新10条
          params['dataType'] = 'json';

          ///action/openapi/news_list
          NetUtils.get(AppUrls.NEWS_LIST, params).then((data) {
            //{
            //    "newslist": [
            //        {
            //            "id": 26754,
            //            "author": "test33",
            //            "pubDate": "2013-09-17 16:49:50.0",
            //            "title": "asdfa",
            //            "authorid": 253469,
            //            "commentCount": 0,
            //            "type": 4
            //        }
            //    ],
            //    "notice": {
            //        "replyCount": 0,
            //        "msgCount": 0,
            //        "fansCount": 0,
            //        "referCount": 0
            //    }
            //}
            print('Debug NEWS_LIST=====: $data');
            if (data != null && data.isNotEmpty) {
              Map<String, dynamic> map = json.decode(data);
              List _newsList = map['newslist'];
              if (!mounted) return;
              setState(() {
                if (isLoadMore) {
                  //加载更多
                  newsList.addAll(_newsList);
                } else {
                  newsList = _newsList;
                }
              });
            }
          });
        });
      }
    });
  }


  @override
  Widget build(BuildContext context) {
    //没有登录就去登录
    if (!isLogin) {
      return Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('由于openapi限制,必须登录才能获取资讯!'),
            InkWell(
              onTap: () async {
                final result = await Navigator.of(context).push(
                    MaterialPageRoute(builder: (context) => LoginWebPage()));
                if (result != null && result == 'refresh') {
                  //登录成功
                  eventBus.fire(LoginEvent());
                }
              },
              child: Text('去登录'),
            ),
          ],
        ),
      );
    }

    //下拉刷新
    Future<Null> _pullToRefresh() async {
      curPage = 1;
      getNewsList(false);
      return null;
    }

    //下拉刷新的
    return RefreshIndicator(
      onRefresh: _pullToRefresh,
      child: buildListView(),
    );
  }

  Widget buildListView() {
    if (newsList == null) {
      getNewsList(false);
      //返回转圈圈
      return CupertinoActivityIndicator();
    }
    return ListView.builder(
        controller: _controller,
        itemCount: newsList.length,
        itemBuilder: (context, index) {
          return NewsListItem(newsList: newsList[index]);
        });
  }
}

NewsListItem.dart单个条目的布局,点击以后会跳转到详情的信息

import 'package:flutter/material.dart';
import 'package:flutterapp2/pages/news_detail_page.dart';

/**
 * 新闻主界面Item的布局
 */
class NewsListItem extends StatelessWidget {
  final Map<String, dynamic> newsList;
  //构造函数
  NewsListItem({this.newsList});

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        Navigator.of(context).push(MaterialPageRoute(
            builder: (context) => NewsDetailPage(id: newsList['id'])));
      },
      child: Container(
        margin: const EdgeInsets.only(left: 20.0),
        decoration: BoxDecoration(
          border: Border(
            bottom: BorderSide(
              color: Color(0xffaaaaaa),
              width: 1.0,
            ),
          ),
        ),
        padding: const EdgeInsets.only(top: 10.0, bottom: 10.0, right: 20.0),
        child: Column(
          children: <Widget>[
            Text('${newsList['title']}',
              style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
              maxLines: 2,//最多2行
              overflow: TextOverflow.ellipsis,//超出是...
            ),
            SizedBox(height:10.0),
            Row(
              //分布在左右两边
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Text(
                  '@${newsList['author']} ${newsList['pubDate'].toString().split(' ')[0]}',
                  style: TextStyle(color: Color(0xaaaaaaaa), fontSize: 14.0),
                ),
                Row(
                  children: <Widget>[
                    Icon(Icons.message),
                    Text('${newsList['commentCount']}',
                      style:TextStyle(color: Color(0xaaaaaaaa), fontSize: 14.0),
                    ),
                  ],
                )
              ],
            ),
          ],
        ),
      ),
    );
  }
}

显示如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值