当前位置: 首页 > news >正文

flutter:使用listview

一,代码:

model:

class ListItemModel {String author;String title;int id;ListItemModel(this.author,this.title, this.id) {}ListItemModel.fromJson(Map<String, dynamic>json):author=json["author"],title = json["title"],id = json["id"];Map<String, dynamic> toJson() {return {"author": author,"title": title,"id": id};}
}

listitem:

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';class ListRowText extends StatelessWidget {final GestureTapCallback onPressed; //点击事件的回调,一旦设置后就不可变final String author;final String title;ListRowText({required this.onPressed, required this.author, required this.title});///sizeBox增加图片和文字的间距@overrideWidget build(BuildContext context) {return Container(margin: EdgeInsets.all(0),color: Colors.white,child: Container(width:560.w,height:160.w,margin: EdgeInsets.fromLTRB(20.w, 20.w, 20.w, 0),//color: Colors.cyan,decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(30.w)),color: Colors.grey.withAlpha(40),),child:Row(children:[_titleWrapper(context, title),_authorWrapper(context, author),]),),);}Widget _authorWrapper(BuildContext context, String text) {return Container(height: 160.w,width:200.w,margin: EdgeInsets.fromLTRB(0.w, 0, 0, 0),decoration: new BoxDecoration(color: Colors.yellow,),alignment: Alignment.centerLeft,child: Text(text,maxLines: 2,overflow: TextOverflow.ellipsis,style: Theme.of(context).textTheme.headlineMedium,),);}Widget _titleWrapper(BuildContext context, String text) {return Container(height: 160.w,width:450.w,margin: EdgeInsets.fromLTRB(20.w, 0, 0, 0),decoration: new BoxDecoration(color: Colors.red,),alignment: Alignment.centerLeft,child: Text(text,maxLines: 2,overflow: TextOverflow.ellipsis,style: Theme.of(context).textTheme.headlineMedium,),);}
}

list:

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';import '../models/ListItemModel.dart';
import 'ListRowText.dart';class ListPoem extends StatefulWidget {//存放列表数据List<ListItemModel> listData=[];ListPoem({required this.listData});@overrideState<ListPoem> createState() => _ListPoemState();
}class _ListPoemState extends State<ListPoem>  {ScrollController _scrollController = ScrollController(); //listview 的控制器void myclick() {print('按钮被点击过了');}///sizeBox增加图片和文字的间距@overrideWidget build(BuildContext context) {return ListView.builder(scrollDirection: Axis.vertical,shrinkWrap: true,itemCount: widget.listData.length,itemBuilder: (BuildContext context, int index) {return getItem(context,index);},controller: _scrollController,);}Widget getItem(BuildContext context,int index) {return new GestureDetector(onTap: () {ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('点击了第 $index 项 (GestureDetector)')),);},child:_buildRow(index),);}//构造list的itemWidget _buildRow(int index) {//非最后一行return ListRowText(onPressed: myclick,author:widget.listData[index].author,title:widget.listData[index].title);}
}

page:

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import '../models/ListItemModel.dart';
import 'dart:convert';
import 'package:flutter/widgets.dart';
import '../views/ListPoem.dart';
import '../views/ListRowText.dart';
class ListItemPage extends StatefulWidget {@override_MyList  createState()=> _MyList();
}//封装的动态页面类
class _MyList extends State<ListItemPage>{//当前第几页int _currentPage = 0;int _total = 1;//存放列表数据List<ListItemModel> _listData=[];//http方式获取数据Future<Null> getHttp() async{String url = 'http://www.lhdtest.net/list.php';print(url);try {var response = await Dio().get(url);print(response);//处理json到类中var resoMap=json.decode(response.toString());//_total = resoMap['data']['total'];//print("total:"+_total.toString());for (int i = 0; i < (resoMap['data']['list'].length); i++) {print("i:"+i.toString());var itemOne = resoMap['data']['list'][i];print(itemOne);ListItemModel itemObj = new ListItemModel(itemOne['author'],itemOne['title'], itemOne['id']);_listData.add(itemObj);}setState(() {});} catch (e) {print(e);}}@overridevoid initState() {// TODO: implement initStatesuper.initState();getHttp();}@overridevoid dispose() {//_scrollController.dispose();super.dispose();}@overrideWidget build(BuildContext context) {var content;if (_listData.length == 0) {content = new Center(// 可选参数 child:child: new CircularProgressIndicator(),);} else {content = ListPoem(listData: _listData,);}return Scaffold(appBar: AppBar(title: Text('这是首页'),),body: Center(child:Column(children:[ElevatedButton(child: Text("下一页"),onPressed: () {print('将跳转到下一页');},),Expanded( // wrap in Expandedchild: content,),],),),);}}

 

 

二,测试效果:

image

http://www.jsqmd.com/news/436373/

相关文章:

  • 2026新疆旅游终极攻略:四季玩法+10条黄金线路+42个避坑指南(辉澜牧歌权威出品) - 户外密码
  • 智元开源灵渠OS,具身智能生态再升级
  • 2026国内最新雪弗板生产厂家推荐:适配多场景需求,这家实力品牌更靠谱 - 十大品牌榜
  • 顺序表的练习2:合并两个有序数组
  • Python的模块
  • OpenAI推GPT-5.3,提升交互实用性
  • 旋转 g.RotateTransform(-45);
  • 三月Pixel更新,安卓新功能大揭秘
  • 谷歌Gemini 3.1 Flash-Lite,轻量模型大能量
  • 风投大佬谈AI浪潮下的投资与变革
  • 基于PLC的智能农业温室大棚控制系统设计与实现
  • 2026年大车床加工领域:实力企业排行及前景展望,大型机械加工/大件加工/数控龙门加工,大车床加工厂商推荐排行 - 品牌推荐师
  • 【audacity操作教程】改变速度不改变音高-
  • open-source
  • 喜力广告:那家永不倒闭的酒吧
  • 2026年深圳弱电工程及综合布线服务推荐服务商:连锁门店、商场、体育馆、4S店等多场景适配 - 海棠依旧大
  • Spring Boot 内嵌 Web 容器启动机制解析:ServletWebServerApplicationContext 深度剖析
  • Spring Boot 响应式 Web 容器启动机制解析:ReactiveWebServerApplicationContext 深度剖析
  • 决定抗衰成败!2026精力管理革命:NAD+转化效率实测,三井NMN稳居榜首 - 资讯焦点
  • 发明专利证书第4338254号背后的技术路径:壹博士如何提升肌肤耐受力 - 资讯焦点
  • 2026年NMN十大排名发布:NMN哪个牌子好?避坑必看品牌推荐 - 资讯焦点
  • 2026重庆锅炉清洗公司优质服务商榜单 - 资讯焦点
  • 2026见效最快洗发水权威测评5款优质单品控油蓬松双效在线 - 资讯焦点
  • 群智企业教练靠谱吗?ICF全线授权与ACTC团队教练认证实力铸就行业标杆 - 资讯焦点
  • 商标转让平台有哪些?2026年主流商标购买平台大合集 - 资讯焦点
  • 2026年最有效的防脱生发精华液怎么选?实测分享 - 品牌排行榜
  • 抗皱纹抗衰老的护肤品哪个牌子好?成分科技+安全性综合测评 - 资讯焦点
  • 2026年AI代码审计工具TOP10服务企业推荐榜 - 资讯焦点
  • 2026年推荐一款好用的护发精油,告别干枯毛躁 - 品牌排行榜
  • GEO优化工具排行榜2026:权威榜单与产品特征 - 资讯焦点