FutureBuilder <列表>不显示任何数据

时间:2018-07-14 10:15:50

标签: android ios sqlite dart flutter

我正在编写一款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甚至都无法发出真正的呼叫。

2 个答案:

答案 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有详细说明。