Flutter的ListVIew获取并动态展示JSON数据
插件配置
dio: ^4.0.4
信息获取——netConfig类
-
import 'dart:io';
-
-
import 'package:dio/dio.dart';
-
-
-
class NetConfig{
-
static String baseurl="http://localhost:8888/articleList/pageview_article";
-
//接口地址,与后台交互
-
-
static getArticle() async {//异步处理
-
try{
-
// ignore: unused_local_variable
-
var response =await Dio().post(baseurl);//发送post请求,获取接口返回的数据
-
if(response.statusCode==200){//判断是否请求成功
-
return response;
-
}
-
}catch(e){ //捕获异常
-
// ignore: avoid_print
-
print(e.toString());
-
}
-
return null;
-
}
-
}
NetConfig这个类中,可以定义很多与后台交互的方法,这里为了展示我只定义了一个方法getArticle(),为了方便我将方法定义为了静态方法,同时为了避免不必要的错误,使用了异步处理await前缀(注意在使用此前缀时,方法上必须加上async异步字样),然后就是调用了Dio的网络通信来获取数据
方法使用——ListViewDemo类
-
import 'dart:convert';
-
-
import 'package:flutter/material.dart';
-
import 'package:patient_project/utils/NetConfig.dart';
-
import 'package:patient_project/utils/articleUsertoken.dart';
-
-
class ListViewDemo extends StatefulWidget {
-
const ListViewDemo({ Key key }) : super(key: key);
-
-
-
State<ListViewDemo> createState() => _ListViewDemoState();
-
}
-
-
class _ListViewDemoState extends State<ListViewDemo> {
-
-
Widget build(BuildContext context) {
-
return Scaffold(
-
appBar: AppBar(
-
title: Text('Demo'),
-
),
-
body: FutureBuilder(//处理异步数据
-
future: NetConfig.getArticle(),//调用NetConfig的getArticle方法
-
builder: (context,snapshot){
-
if(snapshot.hasData){//判断是否有数据
-
var _data=jsonDecode(snapshot.data.toString());
-
//这里返回的时json格式数据,所以要对数据进行解码,jsonDecode是convert中的一个类用来对json解码
-
var article=articleToken.fromJson(_data);
-
//解码后的数据转实体类
-
return ListView.builder(
-
itemCount: article.data.length,//数据的长度
-
itemBuilder: (context,index){
-
return Container(
-
child: Text(article.data[index].articleTitle),
-
);
-
},
-
);
-
}else{
-
Text("no data");
-
}
-
},
-
),
-
);
-
}
-
}
为了大家方便理解我使用了有状态管理(当然大家也可以用getX来编写更方便哦),FutureBuilder是flutter处理异步数据常用的方法,future属性可以调用一个异步方法,builder属性里面可以进行数据处理,比如判断数据是否为空,因为这里返回的时json格式数据,所以要对数据进行解码,jsonDecode是convert中的一个类用来对json解码,同时为了方便后面操作,我将解码后的json转成了实体类,可以搜一下JSON to Dart Converter - Convert JSON Code Online,具体使用如下
好的原理我们已经讲完了,下面开始正式操作
实体类articleToken
-
class articleToken {
-
bool success;
-
int code;
-
String msg;
-
List<Data> data;
-
-
articleToken({this.success, this.code, this.msg, this.data});
-
-
articleToken.fromJson(Map<String, dynamic> json) {
-
success = json['success'];
-
code = json['code'];
-
msg = json['msg'];
-
if (json['data'] != null) {
-
data = <Data>[];
-
json['data'].forEach((v) {
-
data.add(new Data.fromJson(v));
-
});
-
}
-
}
-
-
Map<String, dynamic> toJson() {
-
final Map<String, dynamic> data = new Map<String, dynamic>();
-
data['success'] = this.success;
-
data['code'] = this.code;
-
data['msg'] = this.msg;
-
if (this.data != null) {
-
data['data'] = this.data.map((v) => v.toJson()).toList();
-
}
-
return data;
-
}
-
}
-
-
class Data {
-
int id;
-
String emailuser;
-
String username;
-
String articleTitle;
-
String isattention;
-
String isComment;
-
String content;
-
int agree;
-
int disagree;
-
int comment;
-
int sharecount;
-
String imageurl;
-
String articletime;
-
int viewCounts;
-
// String? articleTime;
-
// String? articleTitle;
-
// String? imageUrl;
-
-
Data(
-
{this.id,
-
this.emailuser,
-
this.username,
-
this.articleTitle,
-
this.isattention,
-
this.isComment,
-
this.content,
-
this.agree,
-
this.disagree,
-
this.comment,
-
this.sharecount,
-
this.imageurl,
-
this.articletime,
-
this.viewCounts,
-
// this.articleTime,
-
// this.articleTitle,
-
// this.imageUrl
-
});
-
-
Data.fromJson(Map<String, dynamic> json) {
-
id = json['id'];
-
emailuser = json['emailuser'];
-
username = json['username'];
-
articleTitle = json['articletitle'];
-
isattention = json['isattention'];
-
isComment = json['is_comment'];
-
content = json['content'];
-
agree = json['agree'];
-
disagree = json['disagree'];
-
comment = json['comment'];
-
sharecount = json['sharecount'];
-
imageurl = json['imageurl'];
-
articletime = json['articletime'];
-
viewCounts = json['view_counts'];
-
// articleTime = json['article_time'];
-
// articleTitle = json['article_title'];
-
// imageUrl = json['image_url'];
-
}
-
-
Map<String, dynamic> toJson() {
-
final Map<String, dynamic> data = new Map<String, dynamic>();
-
data['id'] = this.id;
-
data['emailuser'] = this.emailuser;
-
data['username'] = this.username;
-
data['articletitle'] = this.articleTitle;
-
data['isattention'] = this.isattention;
-
data['is_comment'] = this.isComment;
-
data['content'] = this.content;
-
data['agree'] = this.agree;
-
data['disagree'] = this.disagree;
-
data['comment'] = this.comment;
-
data['sharecount'] = this.sharecount;
-
data['imageurl'] = this.imageurl;
-
data['articletime'] = this.articletime;
-
data['view_counts'] = this.viewCounts;
-
// data['article_time'] = this.articleTime;
-
// data['article_title'] = this.articleTitle;
-
// data['image_url'] = this.imageUrl;
-
return data;
-
}
-
}
主界面
-
import 'dart:convert';
-
import 'package:dio/dio.dart';
-
import 'package:flutter/cupertino.dart';
-
import 'package:flutter/material.dart';
-
import 'package:date_format/date_format.dart';
-
import 'package:get/get.dart';
-
import 'package:patient_project/Home/details/details_Conditions/chat.dart';
-
import 'package:patient_project/utils/Color.dart';
-
import 'package:patient_project/utils/articleUsertoken.dart';
-
-
class ArticleShow extends StatefulWidget {
-
-
State<ArticleShow> createState() => _ArticleListState();
-
}
-
-
class _ArticleListState extends State<ArticleShow> {
-
Color color = Colors.red.shade900;
-
// ignore: prefer_typing_uninitialized_variables
-
static Map<String, dynamic> json;
-
String guanzhu = "关注";
-
DateTime dateTime = DateTime.now();
-
Icon icon = Icon(Icons.add);
-
Widget Rowdate(
-
BuildContext context, double scale, Data data, String anniutitle) {
-
return Row(
-
// crossAxisAlignment: CrossAxisAlignment.stretch,
-
mainAxisAlignment: MainAxisAlignment.spaceBetween,
-
children: <Widget>[
-
Container(
-
child: new Text('${data.username}',
-
style:
-
TextStyle(fontSize: 20 * scale, fontWeight: FontWeight.w700)),
-
),
-
SizedBox(
-
width: 100 * scale,
-
),
-
new Text(
-
data.articletime,
-
// formatDate(DateTime.now(),
-
// [yyyy, "-", mm, "-", dd, " ", HH, ":", nn, ":", ss]),
-
style: Theme.of(context).textTheme.subtitle2,
-
),
-
SizedBox(
-
width: 400 * scale,
-
),
-
RaisedButton(
-
color: Colors.red,
-
textColor: Colors.red,
-
child: Row(
-
children: <Widget>[
-
Icon(Icons.add, color: Colors.white),
-
SizedBox(
-
width: 15 * scale,
-
),
-
Text(
-
"关注",
-
style: TextStyle(
-
color: Colors.white,
-
fontSize: 10 * scale,
-
),
-
),
-
],
-
),
-
shape: RoundedRectangleBorder(
-
side: BorderSide(
-
color: Colors.white,
-
width: 1 * scale,
-
),
-
borderRadius: BorderRadius.circular(8 * scale)),
-
// onPressed: () {
-
// setState(() {
-
// if (acticle.isattention=="false") {
-
// color = Colors.grey.shade600;
-
// guanzhu = "已关注";
-
// icon = Icon(Icons.add_task);
-
// acticle.isattention = "true";
-
// } else {
-
// Color color = Colors.red.shade900;
-
// String guanzhu = "关注";
-
// }
-
// });
-
// // Navigator.of(context).pushNamed('/Sign');
-
// },
-
),
-
],
-
);
-
}
-
-
-
Widget build(BuildContext context) {
-
Size size = MediaQuery.of(context).size;
-
double scale = size.width / 1920;
-
double sizeWidth = MediaQuery.of(context).size.width;
-
double sizeHeight = MediaQuery.of(context).size.height;
-
return SingleChildScrollView(
-
child: ArticleShowList(scale, sizeWidth, sizeHeight, context),
-
);
-
}
-
-
Future getArticle() async {
-
try {
-
String articleUrl = "http://localhost:8888/articleList/pageview_article";
-
Dio dio = new Dio();
-
print("开始请求数据");
-
var response = await dio.post(articleUrl);
-
if (response.statusCode == 200) {
-
return response;
-
}
-
print("请求完成");
-
} catch (e) {
-
print(e.toString());
-
}
-
return null;
-
}
-
-
// List<Data> getlist() {
-
// getArticle().then((result) {
-
// json = jsonDecode(result.toString());
-
// }).whenComplete(() {
-
// print("异步任务处理完成");
-
// print(json['data']);
-
// articleToken content = articleToken.fromJson(json);
-
// print(content.data[1].emailuser);
-
// return content.data;
-
// }).catchError(() {
-
// print("出现异常了");
-
// });
-
// }
-
-
ArticleShowList(
-
double scale, double sizeWidth, double sizeHeight, BuildContext context) {
-
// List<Data> list = getlist();
-
return FutureBuilder(
-
future: getArticle(),
-
builder: (context, snapshot) {
-
if (snapshot.hasData) {
-
var _data = jsonDecode(snapshot.data.toString());
-
var _content = articleToken.fromJson(_data);
-
return Row(
-
mainAxisAlignment: MainAxisAlignment.center,
-
children: [
-
Container(
-
padding: EdgeInsets.all(10),
-
// height: sizeHeight,
-
width: 1200 * scale,
-
// alignment: Alignment.center,
-
// decoration: BoxDecoration(color: Colors.amber),
-
child: Container(
-
height: sizeHeight,
-
child: ListView.builder(
-
itemCount: 5,
-
itemBuilder: (context, index) {
-
print(_content.data[index].articleTitle);
-
return Card(
-
elevation: 10,
-
child: GestureDetector(
-
onTap: () {
-
Get.to(ChatView(),
-
arguments: {'data': _content.data[index]},
-
transition:Transition.zoom,
-
);
-
},
-
child: ListTile(
-
title: Text(
-
_content.data[index].articleTitle,
-
// articleContent.articlrTitle,
-
style: TextStyle(
-
fontWeight: FontWeight.bold,
-
),
-
),
-
subtitle: Container(
-
child: Column(
-
children: <Widget>[
-
SizedBox(
-
height: 10,
-
),
-
Row(
-
children: <Widget>[
-
Container(
-
height: 40 * scale,
-
width: 40 * scale,
-
margin:
-
const EdgeInsets.only(right: 16.0),
-
child: CircleAvatar(
-
backgroundImage: NetworkImage(
-
_content.data[index].imageurl),
-
),
-
),
-
// SizedBox(height: 10,),
-
Rowdate(context, scale,
-
_content.data[index], guanzhu)
-
],
-
),
-
SizedBox(
-
height: 10,
-
),
-
Container(
-
padding: EdgeInsets.only(bottom: 10),
-
child: Text(
-
_content.data[index].content,
-
overflow: TextOverflow.fade,
-
maxLines: 2,
-
)),
-
Row(
-
children: <Widget>[
-
RaisedButton(
-
color: Colors.blue[100],
-
textColor: Colors.white,
-
child: Row(
-
children: <Widget>[
-
Icon(Icons.sentiment_satisfied,
-
color: Colors.blue),
-
SizedBox(
-
width: 15 * scale,
-
),
-
Text(
-
"${'${_content.data[index].agree}'}同意",
-
style: TextStyle(
-
color: Colors.black,
-
fontSize: 10 * scale,
-
),
-
),
-
],
-
),
-
onPressed: () {},
-
),
-
SizedBox(
-
width: 10 * scale,
-
),
-
RaisedButton(
-
color: Colors.blue[100],
-
textColor: Colors.white,
-
child: Row(
-
children: <Widget>[
-
Icon(Icons.sentiment_dissatisfied,
-
color: Colors.blue),
-
SizedBox(
-
width: 15 * scale,
-
),
-
Text(
-
'${_content.data[index].disagree}反对',
-
style: TextStyle(
-
color: Colors.black,
-
fontSize: 10 * scale,
-
),
-
),
-
],
-
),
-
onPressed: () {
-
setState(() {
-
'$index';
-
});
-
// Navigator.of(context).pushNamed('/Sign');
-
},
-
),
-
SizedBox(
-
width: 150 * scale,
-
),
-
FlatButton(
-
color: Colors.white,
-
textColor: Colors.white,
-
child: Row(
-
children: <Widget>[
-
Icon(Icons.comment,
-
color: Colors.blue),
-
SizedBox(
-
width: 15 * scale,
-
),
-
Text(
-
"${'${_content.data[index].comment}'}条评论",
-
style: TextStyle(
-
color: Colors.black,
-
fontSize: 10 * scale,
-
),
-
),
-
],
-
),
-
onPressed: () {
-
setState(() {
-
'$index';
-
});
-
},
-
),
-
SizedBox(
-
width: 10 * scale,
-
),
-
FlatButton(
-
color: Colors.white,
-
textColor: Colors.white,
-
child: Row(
-
children: <Widget>[
-
Icon(Icons.share,
-
color: Colors.blue),
-
SizedBox(
-
width: 15 * scale,
-
),
-
Text(
-
"${_content.data[index].sharecount}次分享",
-
style: TextStyle(
-
color: Colors.black,
-
fontSize: 10 * scale,
-
),
-
),
-
],
-
),
-
onPressed: () {
-
setState(() {
-
index ;
-
});
-
// Navigator.of(context).pushNamed('/Sign');
-
},
-
),
-
SizedBox(
-
width: 10 * scale,
-
),
-
Text(
-
"${_content.data[index].agree}次收藏",
-
),
-
SizedBox(
-
width: 10 * scale,
-
),
-
FlatButton(
-
color: Colors.white,
-
textColor: Colors.white,
-
child: Row(
-
children: <Widget>[
-
Icon(
-
Icons.visibility,
-
color: Colors.yellow,
-
),
-
SizedBox(
-
width: 15 * scale,
-
),
-
Text(
-
"${_content.data[index].viewCounts}浏览",
-
style: TextStyle(
-
color: Colors.black,
-
fontSize: 10 * scale,
-
),
-
),
-
],
-
),
-
onPressed: () {
-
setState(() {
-
index ;
-
});
-
// Navigator.of(context).pushNamed('/Sign');
-
},
-
)
-
],
-
)
-
],
-
),
-
),
-
),
-
),
-
);
-
},
-
),
-
),
-
),
-
-
],
-
);
-
} else {
-
Text("no data");
-
}
-
},
-
);
-
}
-
}
效果展示
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcafjk
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13