import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; class Category { final String name; List devices; Category(this.name) : devices = []; static Future> fetch(String base_url) async { final response = await http.get(Uri.parse("$base_url/devices")); if (response.statusCode == 200) { List categories = []; Map>> json = jsonDecode(response.body); for (MapEntry>> category_entry in json.entries) { Category category = Category(category_entry.key); for (Map device_map in category_entry.value) { Device device = Device( device_map["device_id"], device_map["device_descriptor"], device_map["led"], device_map["power"], device_map["power_draw"]); category.devices.add(device); } categories.add(category); } return categories; } else { throw Exception("Failed to fetch devices"); } } } class CategoryWidget extends StatelessWidget { Category category; CategoryWidget({super.key, required this.category}); @override Widget build(BuildContext context) { var list = category.devices .map((device) => TableRow(children: [ Text(device.device_descriptor ?? device.device_id), Text(device.led_state.toString()), Text(device.power_state.toString()), Text("${device.power_draw.toString()} W") ])) .toList(); list.insert( 0, const TableRow(children: [ Text("Name"), Text("LED"), Text("Power"), Text("Power Draw"), ])); return Column( children: [Text(category.name), Table(children: list)]); } } class Device { final String device_id; String? device_descriptor; bool led_state; bool power_state; double power_draw; Device(this.device_id, this.device_descriptor, this.led_state, this.power_state, this.power_draw); }