我正在编写一款Flutter应用程序,其中列出了纸牌游戏的所有玩家。如果数据库中没有参与者,则应该有一个文本,即找不到数据。但是我的问题是在getStatistik()
内部。该函数不返回任何数据。
这是我要在其中按排名显示播放器的代码:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:watten/model/statistik.dart';
import 'package:watten/database/database.dart';
import 'package:watten/statistik/deleteStatistikDialog.dart';
Future<List<Statistik>> fetchStatistik() async{
var dbHelper = DBHelper();
List<Statistik> statistik = await dbHelper.getStatistik();
print("Length: "+statistik.length.toString()");
return statistik;
}
class Spielerstatistik extends StatefulWidget{
@override
State<StatefulWidget> createState() => _Spielerstatistik();
}
class _Spielerstatistik extends State<Spielerstatistik>{
List statistik;
var dbHelper = DBHelper();
bool datenVorhanden = true;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
backgroundColor: Color(0xFF9C27B0),
title: new Text("Ranking")
),
body: new FutureBuilder<List<Statistik>>(
future: fetchStatistik(),
builder: (context, snapshot){
if(snapshot.hasData){
return new Column(
children: <Widget>[
new Expanded(
child: new ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return new Card(
color: Colors.red,
child: new Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ListTile(
leading: platzNr
? platzierung
: new Text(" ${index+1}"),
title: new Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
new Container(
child: new Text(
snapshot.data[index].name,
style: TextStyle(color: Colors.black),
overflow: TextOverflow.ellipsis,
),
width: 80.0,
),
new Padding(padding: EdgeInsets.only(left: 45.0)),
new Container(
child: new Text(
snapshot.data[index].spielanzahl.toString(),
style: TextStyle(color: Colors.black),
overflow: TextOverflow.ellipsis,
),
width: 55.0,
),
new Container(
decoration: new BoxDecoration(
border: new Border(
left: BorderSide(color: Colors.black26)
)
),
height: 40.0,
margin: EdgeInsets.only(right: 22.0),
),
new Container(
child: new Text(
snapshot.data[index].gewonneneSpiele.toString(),
style: TextStyle(color: textfarbe),
overflow: TextOverflow.ellipsis,
),
width: 12.0,
margin: EdgeInsets.only(right: 20.0),
),
new Container(
decoration: new BoxDecoration(
border: new Border(
left: BorderSide(color: Colors.black26)
)
),
height: 40.0,
margin: EdgeInsets.only(right: 8.0),
),
new Container(
child: new Text(
snapshot.data[index].erfolgsquote.roundToDouble().toString() + " %",//Erfolgsquote
style: TextStyle(color: Colors.black),
overflow: TextOverflow.ellipsis,
),
width: 65.0,
),
],
)
)
],
),
);
}
)
)
],
);
} else if(snapshot.data.length == 0){
return new Text("No Data found!");
}
return new Container(alignment: AlignmentDirectional.center,child: new CircularProgressIndicator(),);
}
),
);
}
}
这是我的代码,我从以下代码获取数据库数据:
Future<List<Statistik>> getStatistik() async{
var dbClient = await db;
List<Map> list = await dbClient.rawQuery('SELECT * FROM statistik');
List<Statistik> statistik = new List();
for(int i = 0; i<list.length; i++){
statistik.add(new Statistik(name: list[i]["$statistikName"] , spielanzahl: list[i]["$statistikSpielanzahl"], gewonneneSpiele: list[i]["$statistikWins"], erfolgsquote: list[i]["erfolgsquote"]));
}
return statistik;
}
我的想法是,因为我内置的print("Length: "+statistik.length.toString()");
并没有打印任何内容,所以FutureBuilder甚至都无法发出真正的呼叫。
答案 0 :(得分:0)
当snapshot.hasData
为假时,snapshot.data
等于null
。因此你不能做
if (snapshot.hasData) {} else if (snapshot.data.length > 0) {}
相反,只需执行if (snapshot.hasData == false)
答案 1 :(得分:0)
我认为,不需要使用$
未来> getStatistik()异步{
var dbClient =等待db;
列表列表=等待dbClient.rawQuery('SELECT * FROM statistik');
列表统计信息=新的List();
for(int i = 0;我
statistik.add(新Statistik(名称:list [i] [“ statistikName”],spielanzahl:list [i]
[“ statistikSpielanzahl”],gewonneneSpiele:list [i] [“ statistikWins”],erfolgsquote:< br /> list [i] [“ erfolgsquote”])));
}
返回统计信息;
}
尝试上面的代码段。 here有详细说明。