我正在嘗試構建一個我想在圖表中顯示一些資料的應用程式。我正在從資料庫中獲取我的資料,并希望對其進行結構化以在FutureBuilder小部件中使用,然后使用syncfusion_flutter_charts: ^20.1.61.
在我嘗試在串列中構造資料以便顯示多行的方法中,出現以下錯誤:
[ERROR:flutter/shell/common/shell.cc(93)] Dart Unhandled Exception: type 'Blob' is not a subtype of type 'String', stack trace: #0
我嘗試將其轉換scores[i]['name']為字串,但沒有幫助。我想我很難理解 Blob 型別是什么以及它發生的原因。
下面的代碼 - 以及資料庫呼叫和獲取我的資料的方法低于此。在發生例外的行上添加了注釋。任何幫助是極大的贊賞。
import 'database.dart';
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_charts/charts.dart';
import 'package:syncfusion_flutter_charts/sparkcharts.dart';
class BanditData {
BanditData(this.name, this.date, this.score);
final String name;
final String date;
final int score;
}
class MyStatsPage extends StatefulWidget {
const MyStatsPage({Key? key}) : super(key: key);
@override
MyStatsPageState createState() {
return MyStatsPageState();
}
}
class MyStatsPageState extends State<MyStatsPage> {
final database = Database();
Future<List<List<BanditData>>> getBanditData() async {
var dates = await database.getDistinctDatesList();
var scores = await database.createScoreDataStruct();
var bandits = await database.getBandits();
List<List<BanditData>> banditData = [];
for (var item in bandits) {
List<BanditData> temp = [];
for (var i = 0; i < scores.length; i ) { /* <--- Exception happens on this line */
BanditData bandit =
BanditData(scores[i]['name'], dates[i], scores[i]['score'][i]);
temp.add(bandit);
}
banditData.add(temp);
}
print(banditData);
return banditData;
}
@override
Widget build(BuildContext context) {
const appTitle = "Stats";
return Scaffold(
appBar: AppBar(
title: const Text(
appTitle,
style: TextStyle(fontSize: 25, fontWeight: FontWeight.w700),
)),
body: FutureBuilder(
future: getBanditData(),
builder: (context, AsyncSnapshot<List<dynamic>> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: CircularProgressIndicator(),
);
} else {
if (snapshot.hasError) {
return ErrorWidget(Exception(
'Error occured when fetching data from database'));
} else if (!snapshot.hasData) {
return const Center(child: Text('No data found.'));
} else {
final _scores = snapshot.data![0];
final _dates = snapshot.data![1];
return Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Expanded(
child: SfCartesianChart(
primaryXAxis: CategoryAxis(),
series: const <ChartSeries>[
/* Line charts here, when the data structure works */
],
))
],
);
}
}
}));
}
}
資料庫代碼:
import 'dart:async';
import 'package:intl/intl.dart';
import 'package:mysql1/mysql1.dart';
class Database {
final dateFormat = DateFormat('yyyy-MM-dd');
Future<MySqlConnection> connect() async {
var settings = ConnectionSettings(
/* REMOVED */
);
var conn = await MySqlConnection.connect(settings);
return conn;
}
Future<List<Map<String, dynamic>>> getBandits() async {
List<Map<String, dynamic>> items = <Map<String, dynamic>>[];
dynamic conn = await connect();
var results = await conn.query('select * from bandit');
for (var row in results) {
items.add({'value': row["ID"], 'label': row["bandit"]});
}
await conn.close();
return items;
}
void insertScore(id, date, course, score) async {
dynamic conn = await connect();
String query1 =
"insert into test_score (Bandit_ID, Bane, dato, Scores) values (?, ?, ?, ?)";
await conn.query(query1, [id, course, date, score]);
conn.close();
}
Future<void> updateDbActive1(id) async {
Future.delayed(const Duration(milliseconds: 500), () async {
dynamic conn = await connect();
String query = "UPDATE test_score SET IkkeAktiv = 1 WHERE Bandit_ID = ?";
await conn.query(query, [id]);
conn.close();
});
}
Future<void> updateDbActive2(id) async {
Future.delayed(const Duration(milliseconds: 500), () async {
dynamic conn = await connect();
String query =
"UPDATE test_score SET IkkeAktiv = 0 WHERE Bandit_ID = ? ORDER BY Scores DESC LIMIT 10";
await conn.query(query, [id]);
conn.close();
});
}
Future<List<String>> getDistinctDatesList() async {
List<String> dates = [];
dynamic conn = await connect();
String query =
"SELECT DISTINCT dato FROM test_score WHERE IkkeAktiv = 0 ORDER BY dato ASC";
var result = await conn.query(query);
for (var row in result) {
dates.add(dateFormat.format(row["dato"]).toString());
}
conn.close();
return dates;
}
Future<List<int>> getPlayerScoreFromDate(id) async {
dynamic conn = await connect();
var dateList = await getDistinctDatesList();
var scores = <int>[];
String query =
"SELECT * FROM test_score WHERE Bandit_ID = ? AND IkkeAktiv = 0 ORDER BY dato ASC";
var result = await conn.query(query, [id]);
var score = 0;
for (var date in dateList) {
var count = 0;
for (var row in result) {
if (date == dateFormat.format(row["dato"]).toString()) {
var value = row["Scores"];
score = value as int;
scores.add(score);
break;
} else {
count ;
if (count == result.length) {
scores.add(score);
}
continue;
}
}
}
conn.close();
return scores;
}
Future<List<Map<String, dynamic>>> createScoreDataStruct() async {
List<Map<String, dynamic>> playerScoresSum = <Map<String, dynamic>>[];
var bandits = await getBandits();
for (var bandit in bandits) {
playerScoresSum.add({
'value': bandit['value'],
'name': bandit['label'],
'scores': await getPlayerScoreFromDate(bandit['value'])
});
}
return playerScoresSum;
}
}
uj5u.com熱心網友回復:
似乎可以通過添加.toString()從資料庫中獲取資料的方法來修復它。
Future<List<Map<String, dynamic>>> createScoreDataStruct() async {
List<Map<String, dynamic>> playerScoresSum = <Map<String, dynamic>>[];
var bandits = await getBandits();
for (var bandit in bandits) {
playerScoresSum.add({
'value': bandit['value'],
'name': bandit['label'].toString(), // <------
'scores': await getPlayerScoreFromDate(bandit['value'])
});
}
print(playerScoresSum);
return playerScoresSum;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498351.html
下一篇:如何從F#中的異步行程更新計數器
