Flutter系列(九)ListView实现新闻列表和正文布局

基础工程:

Flutter系列(四)底部导航+顶部导航+图文列表完整代码_摸金青年v的博客-CSDN博客

相关文章:

Flutter系列(七)ListView 图文列表详解_flutter 图文列表_摸金青年v的博客-CSDN博客

一、前言

        本文用flutter实现新闻app,新闻列表新闻正文布局,效果展示如下图:

Flutter系列(九)ListView实现新闻列表和正文布局_第1张图片              Flutter系列(九)ListView实现新闻列表和正文布局_第2张图片

二、使用的组件

  1. ListView.separated     带分割线的ListView
  2. ListTile         设置每条新闻的布局
  3. Scrollbar      给它的子组件添加页面滚动条,展示浏览进度
  4. SingleChildScrollView      给它的子组件添加滚动效果,而且组合Expanded组件,可以添加固定在页面上顶部或底部的工具栏

三、完整代码

3.1 新闻列表   recommend.dart

import 'package:flutter/material.dart';
import 'package:flutter_play/animationUtile.dart';
import 'package:flutter_play/article.dart';

/*推荐页*/
class RecommendPage extends StatefulWidget {
  @override
  State createState() => _RecommendPage();
}

class _RecommendPage extends State {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Scrollbar(
        child: ListView.separated(
          itemCount: listData.length,  //条目个数:获取数据的个数
          separatorBuilder: (context, index) { // <-- SEE HERE
            return const Divider();
          },  //分割线必要参数
          itemBuilder: (context, index) {
            return GestureDetector(
              onTap: (){
                Navigator.of(context).push(showPageFromRight(ArticlePage())); //点击跳转到新闻详情
              },
              child: ListTile(
                title: Text(listData[index]["title"]), //大标题
                subtitle: Column(
                  crossAxisAlignment: CrossAxisAlignment.start, //左对齐
                  children: [
                    const SizedBox(height: 12),  //设置title和subtitle的间距
                    Text(listData[index]["subtitle"], style: const TextStyle(fontSize: 12, color: Colors.grey)),
                  ],
                ),  //小标题
                trailing: Image.network(listData[index]["image"], fit: BoxFit.fill, width: 110, height: 90), //右侧图片
                visualDensity: const VisualDensity(vertical: 4), //增加item高度,优化布局,便于图片展示
                minVerticalPadding: 8, //组件内边距,title和分割线的垂直间距
              ),
            );
          },
        ),
      ),
    );
  }

  //数据
  List listData = [
    {
      "title": "一汽奔腾T90创新发售,10万级SUV市场多了个性化选择",
      "subtitle": "汽车圈",
      "image": "https://img-blog.csdnimg.cn/c6dfd375abf1433fa3a42951cc186a2b.jpeg",
    },
    {
      "title": "沐飒低于预售价上市,北京现代瞄准70%的大多数",
      "subtitle": "北京现代",
      "image": "https://img-blog.csdnimg.cn/678c0686dc694b65ad6b20693dbc35f1.jpeg",
    },
    {
      "title": "第二款奥特能平台车型上市,别克加速布局主流电动车市场",
      "subtitle": "电动车",
      "image": "https://img-blog.csdnimg.cn/63efe7acbac74e7ebce85e3801f948e3.jpeg",
    },
    {
      "title": "一汽奔腾T90创新发售,10万级SUV市场多了个性化选择",
      "subtitle": "汽车圈",
      "image": "https://img-blog.csdnimg.cn/c6dfd375abf1433fa3a42951cc186a2b.jpeg",
    },
    {
      "title": "沐飒低于预售价上市,北京现代瞄准70%的大多数",
      "subtitle": "北京现代",
      "image": "https://img-blog.csdnimg.cn/678c0686dc694b65ad6b20693dbc35f1.jpeg",
    },
    {
      "title": "第二款奥特能平台车型上市,别克加速布局主流电动车市场",
      "subtitle": "电动车",
      "image": "https://img-blog.csdnimg.cn/63efe7acbac74e7ebce85e3801f948e3.jpeg",
    },
    {
      "title": "一汽奔腾T90创新发售,10万级SUV市场多了个性化选择",
      "subtitle": "汽车圈",
      "image": "https://img-blog.csdnimg.cn/c6dfd375abf1433fa3a42951cc186a2b.jpeg",
    },
    {
      "title": "沐飒低于预售价上市,北京现代瞄准70%的大多数",
      "subtitle": "北京现代",
      "image": "https://img-blog.csdnimg.cn/c6dfd375abf1433fa3a42951cc186a2b.jpeg",
    },
    {
      "title": "第二款奥特能平台车型上市,别克加速布局主流电动车市场",
      "subtitle": "电动车",
      "image": "https://img-blog.csdnimg.cn/c6dfd375abf1433fa3a42951cc186a2b.jpeg",
    },
  ];

}

页面切换特效:右侧滑入工具类   animationUtile.dart

import 'package:flutter/material.dart';

/*动画效果-工具方法*/

/*页面切换动画-页面从屏幕右侧滑入
* @param statelessWidget 传入需要跳转的页面
* */
Route showPageFromRight(StatefulWidget statefulWidget) {
  return PageRouteBuilder(
    pageBuilder: (context, animation, secondaryAnimation) => statefulWidget,
    transitionsBuilder: (context, animation, secondaryAnimation, child) {
      var begin = const Offset(1.0, 0.0);  //页面进入的起点坐标
      var end = Offset.zero;    //页面进入的终点坐标
      const curve = Curves.ease;
      var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
      return SlideTransition(
        position: animation.drive(tween),
        child: child,
      );
    },
  );
}

3.2 文章布局

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

/*新闻详情页*/
class ArticlePage extends StatefulWidget {
  @override
  State createState() => _ArticlePage();
}

class _ArticlePage extends State {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        foregroundColor: Colors.black, //字体颜色
        backgroundColor: const Color(0xFFFBFBFB), //顶部背景色
        title: const Text('最新新闻', style: TextStyle(fontWeight: FontWeight.w300, fontSize: 15)),
        actions: [
          IconButton(
            onPressed: () {},
            icon: const Icon(Icons.more_horiz), //更多操作
          ),
        ],
      ),
      body: Scrollbar(
        child: Column(
          children: [
            Expanded(
              child: SingleChildScrollView(
                child: Column(
                  children: [
                    tile(),  //标题+作者+关注
                    picture(), //图片
                    articleContent(), // 文章内容
                    statement(), // 版权声明
                  ],
                ),
              ),
            ), //实现底部固定必需
            bottomFix() //底部固定栏(点赞+收藏+分享)
          ],
        ),
      ) //进度条
    );
  }

  /*标题+作者*/
  Container tile(){
    return Container(
        margin: const EdgeInsets.all(20),
        child: Column(
          children: [
            Text(data["title"]!, style: const TextStyle(fontWeight: FontWeight.w400, fontSize: 18, color: Colors.black)),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween, //主轴(水平方向)两端对齐
              children: [
                Text(data["subtitle"]!, style: const TextStyle(fontWeight: FontWeight.w600, fontSize: 14, color: Colors.grey)),
                TextButton (
                  style: ButtonStyle(
                      minimumSize: MaterialStateProperty.all(const Size(64, 24)),  //按钮宽高设置
                      backgroundColor: MaterialStateProperty.all(Colors.blueAccent), //背景颜色
                      foregroundColor: MaterialStateProperty.all(Colors.white), //字体颜色
                      shape: MaterialStateProperty.all(RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), //圆角
                  ),//扁平风格按钮
                  child: const Text('关注'),
                  onPressed: () {

                  },
                ),
              ]
            )
          ],
        ),
    );
  }

  /*图片*/
  Padding picture(){
    return Padding(
      padding: const EdgeInsets.all(5),
      child: Image.network(data["image"]!, fit: BoxFit.fill, width: 500, height: 240), // 图片,
    );
  }

  /*文章内容*/
  Padding articleContent(){
    return Padding(
      padding: const EdgeInsets.all(20),
      child: Text(data["content"]!, style: const TextStyle(fontWeight: FontWeight.w300, fontSize: 16, color: Colors.black)),
    );
  }

  //数据
  var data = {
    "title" : "一汽奔腾T90创新发售,10万级SUV市场多了个性化选择",
    "subtitle": "汽车圈",
    "image": "https://img-blog.csdnimg.cn/c6dfd375abf1433fa3a42951cc186a2b.jpeg",
    "content": "财联社6月2日讯(编辑 卞纯)去年底人工智能(AI)聊天机器人ChatGPT的问世,在全球范围内掀起了一股AI热潮,并推动AI的发展步入“快车道”。根据一份行业报告,ChatGPT及其竞争对手谷歌Bard等AI工具的发布,将推动一场长达十年的AI繁荣,预计到2032年,生成式AI市场的营收规模将从去年的400亿美元增长逾30倍至1.3万亿美元。根据以曼迪普·辛格(Mandeep Singh)为首的彭博智库(Bloomberg Intelligence)分析师发布的一份新报告,未来十年生成式AI行业可能会以高达42%的复合速度高速增长。报告指出,生成式AI市场将首先由训练AI系统所必需的基础设施需求推动,到2032年,这方面的业务收入将达到2470亿美元;然后,增长动力来自使用AI模型、广告等服务的设备,到2032年,AI支持的数字广告业务收入将达1920亿美元,AI服务器的收入可能达1340亿美元。“未来十年,世界将看到AI领域的爆炸式增长,这有望从根本上改变科技行业的运作方式。” 辛格周四在一份声明中表示。“随着这项技术的发展,它将成为IT支出、广告支出和网络安全等领域中越来越重要的一部分。”自去年年底ChatGPT推出以来,对生成式AI的需求在全球范围内激增,这项技术有望颠覆从客户服务到银行业的一切。这一生成式AI产品使用来自互联网的大量数据样本来学习如何对指令做出反应,能够制作逼真的图像以及像真人一样回答问题。报告还称,亚马逊旗下云计算部门AWS、谷歌母公司Alphabet Inc.、英伟达公司和OpenAI的投资者微软很可能成为人工智能热潮的最大赢家。财联社6月2日讯(编辑 卞纯)去年底人工智能(AI)聊天机器人ChatGPT的问世,在全球范围内掀起了一股AI热潮,并推动AI的发展步入“快车道”。根据一份行业报告,ChatGPT及其竞争对手谷歌Bard等AI工具的发布,将推动一场长达十年的AI繁荣,预计到2032年,生成式AI市场的营收规模将从去年的400亿美元增长逾30倍至1.3万亿美元。根据以曼迪普·辛格(Mandeep Singh)为首的彭博智库(Bloomberg Intelligence)分析师发布的一份新报告,未来十年生成式AI行业可能会以高达42%的复合速度高速增长。报告指出,生成式AI市场将首先由训练AI系统所必需的基础设施需求推动,到2032年,这方面的业务收入将达到2470亿美元;然后,增长动力来自使用AI模型、广告等服务的设备,到2032年,AI支持的数字广告业务收入将达1920亿美元,AI服务器的收入可能达1340亿美元。“未来十年,世界将看到AI领域的爆炸式增长,这有望从根本上改变科技行业的运作方式。” 辛格周四在一份声明中表示。“随着这项技术的发展,它将成为IT支出、广告支出和网络安全等领域中越来越重要的一部分。”自去年年底ChatGPT推出以来,对生成式AI的需求在全球范围内激增,这项技术有望颠覆从客户服务到银行业的一切。这一生成式AI产品使用来自互联网的大量数据样本来学习如何对指令做出反应,能够制作逼真的图像以及像真人一样回答问题。报告还称,亚马逊旗下云计算部门AWS、谷歌母公司Alphabet Inc.、英伟达公司和OpenAI的投资者微软很可能成为人工智能热潮的最大赢家。"
  };

  /*版权声明*/
  Padding statement(){
    return const Padding(
      padding: EdgeInsets.all(20),
      child: Text('版权声明', style: TextStyle(fontWeight: FontWeight.w600, fontSize: 14, color: Colors.grey)),
    );
  }

  /*底部固定栏(点赞+收藏+分享)*/
  SizedBox bottomFix(){
    return SizedBox(
      width: 500,
      height: 50,
      child: ButtonBar(
        children: [
          IconButton(
            color: Colors.grey,
            icon: const Icon(CupertinoIcons.heart),
            onPressed:(){},
          ),
          IconButton(
            color: Colors.grey,
            icon: const Icon(Icons.star_border_outlined),
            onPressed:(){},
          ),
          IconButton(
            color: Colors.grey,
            icon: const Icon(Icons.share),
            onPressed:(){},
          ),
        ]
      ),
    );
  }

}

四、相关资料

4.1 解决的问题

1. 大标题和小标题的间距问题

想设置 ListTile 的 title 和 subtitle间距,在ListTile没有找到这个属性,后来发现 subtitle 是组件,可以通过如下方式设置间距

title: Text(listData[index]["title"]), //大标题
subtitle: Column(
       crossAxisAlignment: CrossAxisAlignment.start, //左对齐
       children: [
           const SizedBox(height: 12),  //设置title和subtitle的间距
           Text(listData[index]["subtitle"], style: const TextStyle(fontSize: 12, color: Colors.grey)),
       ],
),

4.2 图片素材

图片素材来源:https://pixabay.com/zh/    免版权图片网站

Flutter系列(九)ListView实现新闻列表和正文布局_第3张图片                Flutter系列(九)ListView实现新闻列表和正文布局_第4张图片

网络加载使用:

https://img-blog.csdnimg.cn/678c0686dc694b65ad6b20693dbc35f1.jpeg

https://img-blog.csdnimg.cn/63efe7acbac74e7ebce85e3801f948e3.jpeg

本文结束

你可能感兴趣的:(flutter,flutter)