Listview 颤振状态代码问题。在setstate中放什么?
我从现在开始学习颤振。我非常理解代码,但是我仍然有一些问题需要理解状态以及在创建状态中放置什么。在一个教程之后,我制作了这个应用程序,它加载带有地震信息的json,并显示在一个侧面带有滚动条的列表视图中。现在我想让它成为一个有状态的小部件,并使用onrefresh更新json中的值。这是我的代码(无状态) `Listview 颤振状态代码问题。在setstate中放什么?,listview,mobile,dart,flutter,Listview,Mobile,Dart,Flutter,我从现在开始学习颤振。我非常理解代码,但是我仍然有一些问题需要理解状态以及在创建状态中放置什么。在一个教程之后,我制作了这个应用程序,它加载带有地震信息的json,并显示在一个侧面带有滚动条的列表视图中。现在我想让它成为一个有状态的小部件,并使用onrefresh更新json中的值。这是我的代码(无状态) ` 导入“包装:颤振/材料.省道”; 导入“dart:async”; 导入“dart:convert”; 将“package:http/http.dart”导入为http; 导入“包:intl
导入“包装:颤振/材料.省道”;
导入“dart:async”;
导入“dart:convert”;
将“package:http/http.dart”导入为http;
导入“包:intl/intl.dart”;
地图-地震;
列出_特性;//oggesto列表delle功能
void main()异步{
_地震=等待获取地震();
_特征=_地震[“特征”];
runApp(新材料)PP(
主题:新主题数据(
accentColor:Colors.red,
),
debugShowCheckedModeBanner:false,
颜色:颜色,红色,
标题:“Terremoti”,
首页:新地震(),
));
}
类震动扩展了无状态控件{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(“Tutti i Terremoti ultime 24小时”),
标题:对,
背景颜色:Colors.red,
),
正文:新中心(
孩子:新的滚动条(
子:刷新指示器(
onRefresh:getQuakes,
子项:ListView.builder(
itemCount:_features.length,
填充:常数边集全部(15.0),
itemBuilder:(构建上下文,位置){
如果(位置.isOdd)
返回新的SizedBox(
身高:10.0,
孩子:新中心(
子容器:新容器(
页边距:仅限新边InsetsDirective(
开始:1.0,结束:1.0),
身高:2.5,
颜色:颜色,红色,
),
),
);
最终指数=位置~/2;
var格式=新的日期格式(“dd-MMM,yyyy,\n”+“HH:mm:ss”);
//var dateString=format.format(格式);
var date=format.format(
新DateTime.From毫秒新纪元(
_功能[索引][“属性”][“时间”],
isUtc:true);
//莱里希酒店
返回新的ListTile(
标题:新文本(
“Magnitudo:${U features[index][“properties”][“mag”]}\n$date”,
样式:新文本样式(
字体大小:21.0,
颜色:颜色。绿色,
fontWeight:fontWeight.w700),
),
字幕:新文本(
“Luogo:${{u features[index][“properties”][“place”]}”,
样式:新文本样式(
字体大小:18.0,
),
),
);
}),
),
)),
);
}
}
未来的getQuakes()异步{
字符串apiUrl=
"https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson";
http.Response-Response=wait-http.get(apirl);
返回json.decode(response.body);
}
`提取代码以重新加载列表,并将其作为
状态
类的实例方法。接下来,允许列表为空(显示进度指示器)。最后,从initState
调用重载方法
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:intl/intl.dart';
void main() async {
runApp(MaterialApp(
theme: ThemeData(
accentColor: Colors.red,
),
debugShowCheckedModeBanner: false,
color: Colors.red,
title: 'Terremoti',
home: Quakes(),
));
}
class Quakes extends StatefulWidget {
@override
State createState() => QuakesState();
}
class QuakesState extends State<Quakes> {
DateFormat format = DateFormat('dd MMM, yyyy, \nHH:mm:ss');
List _features;
@override
void initState() {
super.initState();
reload();
}
Future<void> reload() async {
final Map quakes = await getQuakes();
setState(() {
_features = quakes['features'];
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Tutti i Terremoti ultime 24h'),
centerTitle: true,
backgroundColor: Colors.red,
),
body: Center(
child: _features == null
? const CircularProgressIndicator()
: Scrollbar(
child: RefreshIndicator(
onRefresh: reload,
child: ListView.builder(
itemCount: _features.length,
padding: const EdgeInsets.all(15.0),
itemBuilder: (BuildContext context, position) {
if (position.isOdd)
return SizedBox(
height: 10.0,
child: Center(
child: Container(
margin: const EdgeInsetsDirectional.only(
start: 1.0,
end: 1.0,
),
height: 2.5,
color: Colors.red,
),
),
);
final int index = position ~/ 2;
final String date = format.format(
DateTime.fromMillisecondsSinceEpoch(
_features[index]['properties']['time'],
isUtc: true));
//creando le righe della listview
return ListTile(
title: Text(
"Magnitudo: ${_features[index]["properties"]["mag"]} \n $date",
style: const TextStyle(
fontSize: 21.0,
color: Colors.green,
fontWeight: FontWeight.w700),
),
subtitle: Text(
"Luogo: ${_features[index]["properties"]["place"]}",
style: const TextStyle(
fontSize: 18.0,
),
),
);
}),
),
),
),
);
}
}
Future<Map> getQuakes() async {
final http.Response response = await http.get(
'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson');
return json.decode(response.body);
}
导入'dart:async';
导入“dart:convert”;
进口“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
导入“包:intl/intl.dart”;
void main()异步{
runApp(材料应用程序)(
主题:主题数据(
accentColor:Colors.red,
),
debugShowCheckedModeBanner:false,
颜色:颜色,红色,
标题:“Terremoti”,
首页:地震(),
));
}
类地震扩展了StatefulWidget{
@凌驾
State createState()=>QuakesState();
}
类QuakesState扩展了状态{
DateFormat=DateFormat('dd-MMM,yyyy,\nHH:mm:ss');
列出"功能",;
@凌驾
void initState(){
super.initState();
重新加载();
}
Future reload()异步{
最终地图地震=等待获取地震();
设置状态(){
_特征=地震[‘特征’];
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:const Text('Tutti Terremoti ultime 24h'),
标题:对,
背景颜色:Colors.red,
),
正文:中(
子项:_features==null
?常数循环前进指示器()
:滚动条(
子:刷新指示器(
onRefresh:重新加载,
子项:ListView.builder(
itemCount:_features.length,
填充:常数边集全部(15.0),
itemBuilder:(构建上下文,位置){
如果(位置.isOdd)
返回大小框(
身高:10.0,
儿童:中心(
子:容器(
边距:仅限const EdgeInsetsDirective(
起点:1.0,
完:1.0,,
),
身高:2.5,
颜色:颜色,红色,
),
),
);
最终整数指数=位置~/2;
最终字符串日期=format.format(
DateTime.From毫秒新纪元(
_功能[索引]['properties']['time'],
isUtc:true);
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:intl/intl.dart';
void main() async {
runApp(MaterialApp(
theme: ThemeData(
accentColor: Colors.red,
),
debugShowCheckedModeBanner: false,
color: Colors.red,
title: 'Terremoti',
home: Quakes(),
));
}
class Quakes extends StatefulWidget {
@override
State createState() => QuakesState();
}
class QuakesState extends State<Quakes> {
DateFormat format = DateFormat('dd MMM, yyyy, \nHH:mm:ss');
List _features;
@override
void initState() {
super.initState();
reload();
}
Future<void> reload() async {
final Map quakes = await getQuakes();
setState(() {
_features = quakes['features'];
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Tutti i Terremoti ultime 24h'),
centerTitle: true,
backgroundColor: Colors.red,
),
body: Center(
child: _features == null
? const CircularProgressIndicator()
: Scrollbar(
child: RefreshIndicator(
onRefresh: reload,
child: ListView.builder(
itemCount: _features.length,
padding: const EdgeInsets.all(15.0),
itemBuilder: (BuildContext context, position) {
if (position.isOdd)
return SizedBox(
height: 10.0,
child: Center(
child: Container(
margin: const EdgeInsetsDirectional.only(
start: 1.0,
end: 1.0,
),
height: 2.5,
color: Colors.red,
),
),
);
final int index = position ~/ 2;
final String date = format.format(
DateTime.fromMillisecondsSinceEpoch(
_features[index]['properties']['time'],
isUtc: true));
//creando le righe della listview
return ListTile(
title: Text(
"Magnitudo: ${_features[index]["properties"]["mag"]} \n $date",
style: const TextStyle(
fontSize: 21.0,
color: Colors.green,
fontWeight: FontWeight.w700),
),
subtitle: Text(
"Luogo: ${_features[index]["properties"]["place"]}",
style: const TextStyle(
fontSize: 18.0,
),
),
);
}),
),
),
),
);
}
}
Future<Map> getQuakes() async {
final http.Response response = await http.get(
'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson');
return json.decode(response.body);
}