Android 在其他小部件中使用解析的JSON数据进行颤振
我是Flatter的新手,目前正在创建一个数据可视化/统计应用程序。它使用HTTP请求并解析JSON数组,我遵循的在线指南已成功地将数据解析为listview。不过,我希望在其他小部件(如图形和图表)中使用这些数据。我的代码目前看起来像这样Android 在其他小部件中使用解析的JSON数据进行颤振,android,flutter,Android,Flutter,我是Flatter的新手,目前正在创建一个数据可视化/统计应用程序。它使用HTTP请求并解析JSON数组,我遵循的在线指南已成功地将数据解析为listview。不过,我希望在其他小部件(如图形和图表)中使用这些数据。我的代码目前看起来像这样 import 'dart:async'; import 'dart:convert'; import 'dart:ffi'; import 'package:flutter/foundation.dart'; import 'package:flutter/
import 'dart:async';
import 'dart:convert';
import 'dart:ffi';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
Future<List<Post>> fetchPosts(http.Client client) async {
var url = "http://172.22.49.41:4998/androidconnect/Api.php";
//var url = "http://192.168.1.220:4998/getEnv1.php?n=4";
var client = new http.Client();
var request = new http.Request('POST', Uri.parse(url));
var body = {'type': 'getContacts'};
request.bodyFields = body;
var data = await http.post(url, body: {"type": "getContacts"});
print(data.body);
return await compute(parsePosts, data.body);
}
// A function that will convert a response body into a List<Photo>
List<Post> parsePosts(String responseBody) {
final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
return parsed.map<Post>((json) => Post.fromJson(json)).toList();
}
class Post {
String time;
dynamic sen1; // Sensor variables declared as dynamic as its values has the tendency to change between double and int
dynamic sen2;
dynamic sen3;
dynamic sen4;
dynamic sen5;
dynamic sen6;
Post({this.time, this.sen1, this.sen2, this.sen3, this.sen4, this.sen5, this.sen6});
factory Post.fromJson(Map<String, dynamic> json) {
return new Post(
time: json['Date'] as String, // Parsed Date values are read as String
sen1: json['Sen1'] as dynamic, // Parsed Sensor values are kept as double or int in database therefore use dynamic
sen2: json['Sen2'] as dynamic,
sen3: json['Sen3'] as dynamic,
sen4: json['Sen4'] as dynamic, // **Sen4, Sen5, Sen6 values are currently hardcoded in database for testing purposes. Wait until actual data values are used or edit accordingly**
sen5: json['Sen5'] as dynamic,
sen6: json['Sen6'] as dynamic,
);
}
}
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final appTitle = 'Sensors';
return MaterialApp(
title: appTitle,
home: MyHomePage(title: appTitle),
);
}
}
class MyHomePage extends StatelessWidget {
final String title;
MyHomePage({Key key, this.title}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: FutureBuilder<List<Post>>(
future: fetchPosts(http.Client()),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? PhotosList(photos: snapshot.data)
: Center(child: CircularProgressIndicator());
},
),
);
}
}
class PhotosList extends StatelessWidget {
final List<Post> photos;
PhotosList({Key key, this.photos}) : super(key: key);
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.topCenter,
child: ListView.builder(
reverse: true, // Configs needed to update latest info at the top instead of bottom
shrinkWrap: true,
itemCount: photos == null ? 0 : photos.length,
itemBuilder: (BuildContext context, i) {
return new ListTile(
contentPadding: EdgeInsets.symmetric(horizontal: 0.0),
title: new Text("Sen1: " + photos[i].sen1.toString() + " Sen2: " + photos[i].sen2.toString() + " Sen3: " + photos[i].sen3.toString() + " \nSen4: " + photos[i].sen4.toString() + " Sen5: " + photos[i].sen5.toString() + " Sen6: " + photos[i].sen6.toString()),
subtitle: new Text("Time recorded: " + photos[i].time.toString()),
);
}
)
);
}
}
导入'dart:async';
导入“dart:convert”;
进口“dart:ffi”;
进口“包装:颤振/基础.dart”;
进口“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
将来的fetchpost(http.Client-Client)异步{
变量url=”http://172.22.49.41:4998/androidconnect/Api.php";
//变量url=”http://192.168.1.220:4998/getEnv1.php?n=4";
var client=newhttp.client();
var request=newhttp.request('POST',Uri.parse(url));
var body={'type':'getContacts'};
request.bodyFields=body;
var data=wait http.post(url,主体:{“type”:“getContacts”});
打印(data.body);
返回等待计算(parsePosts、data.body);
}
//将响应主体转换为列表的函数
列表解析帖子(字符串响应库){
final parsed=json.decode(responseBody.cast();
返回parsed.map((json)=>Post.fromJson(json)).toList();
}
班岗{
串时间;
dynamic sen1;//声明为动态的传感器变量的值有在double和int之间变化的趋势
动态sen2;
动态sen3;
动态sen4;
动态sen5;
动态sen6;
Post({this.time,this.sen1,this.sen2,this.sen3,this.sen4,this.sen5,this.sen6});
factory Post.fromJson(映射json){
换岗(
time:json['Date']作为字符串,//解析的日期值作为字符串读取
sen1:json['sen1']是动态的,//解析的传感器值在数据库中保持为double或int,因此使用动态
sen2:json['sen2']是动态的,
sen3:json['sen3']是动态的,
sen4:json['sen4']是动态的,//**sen4、Sen5、Sen6值当前已在数据库中硬编码以供测试。请等待实际数据值被使用或进行相应编辑**
sen5:json['sen5']是动态的,
sen6:json['sen6']是动态的,
);
}
}
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
最终appTitle=‘传感器’;
返回材料PP(
标题:appTitle,
主页:我的主页(标题:appTitle),
);
}
}
类MyHomePage扩展了无状态小部件{
最后的字符串标题;
MyHomePage({Key,this.title}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(标题),
),
正文:未来建设者(
未来:fetchPosts(http.Client()),
生成器:(上下文,快照){
if(snapshot.hasError)打印(snapshot.error);
返回snapshot.hasData
?照片列表(照片:快照。数据)
:居中(子项:循环压缩机指示器());
},
),
);
}
}
类PhotosList扩展了无状态小部件{
最后名单照片;
PhotosList({Key,this.photos}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回对齐(
对齐:alignment.topCenter,
子项:ListView.builder(
反向:true,//配置需要在顶部而不是底部更新最新信息
收缩膜:对,
itemCount:photos==null?0:photos.length,
itemBuilder:(构建上下文,i){
返回新的ListTile(
contentPadding:EdgeInsets.对称(水平:0.0),
标题:新文本(“Sen1:+照片[i].Sen1.toString()+”Sen2:+照片[i].Sen2.toString()+”Sen3:+照片[i].Sen3.toString()+”\nSen4:+照片[i].sen4.toString()+”Sen5:+照片[i].Sen5.toString()+”Sen6:+照片[i].Sen6.toString()),
字幕:新文本(“记录的时间:+photos[i].Time.toString()),
);
}
)
);
}
}
在listview中,使用photos[i].sen1.toString()打印值。我如何在其他小部件/类中使用它?提前谢谢。。。。
...
itemCount: photos == null ? 0 : photos.length,
itemBuilder: (BuildContext context, i) {
return ItemList(post: snapshot.data[i]);
}
// the other class
class ItemList extends StatelessWidget {
final Post post; // This post is Iterator of List<Post>
const ItemList({Key key, this.post}) : super(key: key);
return ListTile(
contentPadding: EdgeInsets.symmetric(horizontal: 0.0),
title: new Text("Sen1: " + photos.sen1.toString() + " Sen2: " + photos.sen2.toString() + " Sen3: " + photos.sen3.toString() + " \nSen4: " + photos.sen4.toString() + " Sen5: " + photos.sen5.toString() + " Sen6: " + photos.sen6.toString()),
subtitle: new Text("Time recorded: " + photos.time.toString()),
);
}
itemCount:photos==null?0:photos.length,
itemBuilder:(构建上下文,i){
返回ItemList(post:snapshot.data[i]);
}
//另一类
类ItemList扩展了无状态小部件{
final Post;//此Post是列表的迭代器
const ItemList({Key-Key,this.post}):super(Key:Key);
返回列表块(
contentPadding:EdgeInsets.对称(水平:0.0),
标题:新文本(“Sen1:+photos.Sen1.toString()+”Sen2:+photos.Sen2.toString()+”Sen3:+photos.Sen3.toString()+”\nSen4:“+photos.sen4.toString()+”Sen5:+photos.Sen5.toString()+”Sen6:+photos.Sen6.toString()),
字幕:新文本(“记录的时间:+photos.Time.toString()),
);
}
新建现在是可选的。这指出了如何在另一个列表视图中使用它,但是我希望能够使用photos.sen.的值。。在其他地方,例如表格或图形值,或者这是不可能的?