Android 在其他小部件中使用解析的JSON数据进行颤振

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/

我是Flatter的新手,目前正在创建一个数据可视化/统计应用程序。它使用HTTP请求并解析JSON数组,我遵循的在线指南已成功地将数据解析为listview。不过,我希望在其他小部件(如图形和图表)中使用这些数据。我的代码目前看起来像这样

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.的值。。在其他地方,例如表格或图形值,或者这是不可能的?