FutureBuilder 未显示任何数据

问题描述 投票:0回答:2

我正在编写一款轻巧的应用程序,其中列出了纸牌游戏的所有玩家。如果数据库中没有参与者,则应该有一个文本,即未找到数据。但是我的问题在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;
  }

我的想法是,FutureBuilder甚至没有发出真正的呼叫,因为我内置的print("Length: "+statistik.length.toString()");没有打印任何内容。

android ios sqlite dart flutter
2个回答
0
投票

snapshot.hasData为假时,snapshot.data等于null。因此,您不能这样做

if (snapshot.hasData) {} else if (snapshot.data.length > 0) {}

而不是只执行if (snapshot.hasData == false)


0
投票

我认为不需要使用$。试试下面的代码片段。详细说明here

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;
  }
© www.soinside.com 2019 - 2024. All rights reserved.