参数类型'Future <>'不能分配给参数类型''

时间:2020-09-19 06:21:25

标签: flutter future sqflite flutter-change-notifier

我正在尝试构建GridView列表。当我创建一个简单的“玩家”列表时,所有这些都有效,但是现在我尝试使用sqflite持久保存数据,并且出现错误:

错误:参数类型'Future'无法分配给参数类型'int'

这是我的列表构建器小部件:

class PlayerList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<PlayerData>(
      builder: (context, playerData, child) {
        return GridView.builder(
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2,
              mainAxisSpacing: 20,
              crossAxisSpacing: 20,
            ),
            itemCount: playerData.playerCount,
            itemBuilder: (BuildContext context, int index) {
              final player = playerData.players[index];
              return RawMaterialButton(
                  fillColor: Color(0x991c5597),
                  elevation: 20,
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(10),
                  ),
                  child: Padding(
                    padding: const EdgeInsets.all(10.0),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.center,
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      children: <Widget>[
                        CircleAvatar(
                          backgroundColor: Colors.tealAccent,
                          radius: 30,
                          child: Icon(
                            Icons.star,
                            color: Color(0xFF16377a),
                            size: 30,
                          ),
                        ),
                        Text(player.name, style: smallTitleText),
                      ],
                    ),
                  ),
                  onPressed: () {
                    playerData.makeActive(player.name);
                    playerData.printList();
                    Navigator.pushNamed(context, PlayScreen.id);
                  });
            });
      },
    );
  }
}

这是我获取列表计数的方式:

Future<int> get playerCount async {
  final Database db = await getDBConnector();
  final List<Map<String, dynamic>> maps = await db.query('players');
  if (maps.length != null) {
    return maps.length;
  } else { return 0;}
}

2 个答案:

答案 0 :(得分:0)

出现错误是因为playerCount没有返回int而返回了Future。首先,您必须将类更改为有状态的小部件,并按如下所示加载数据



class PlayerList extends StatefulWidget {
  @override
  _PlayerListState createState() => _PlayerListState();
}

class _PlayerListState extends State<PlayerList> {
  int count;

  @override
  void initState() {
    super.initState();
    loadPlayerCount();
  }

  @override
  Widget build(BuildContext context) {
    return Consumer<PlayerData>(
      builder: (context, playerData, child) {
        return GridView.builder(
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2,
              mainAxisSpacing: 20,
              crossAxisSpacing: 20,
            ),
            itemCount: count??0,
            itemBuilder: (BuildContext context, int index) {
              final player = playerData.players[index];
              return RawMaterialButton(
                  fillColor: Color(0x991c5597),
                  elevation: 20,
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(10),
                  ),
                  child: Padding(
                    padding: const EdgeInsets.all(10.0),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.center,
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      children: <Widget>[
                        CircleAvatar(
                          backgroundColor: Colors.tealAccent,
                          radius: 30,
                          child: Icon(
                            Icons.star,
                            color: Color(0xFF16377a),
                            size: 30,
                          ),
                        ),
                        Text(player.name, style: smallTitleText),
                      ],
                    ),
                  ),
                  onPressed: () {
                    playerData.makeActive(player.name);
                    playerData.printList();
                    Navigator.pushNamed(context, PlayScreen.id);
                  });
            });
      },
    );
  }

  void loadPlayerCount() async{
    final Database db = await getDBConnector();
    final List<Map<String, dynamic>> maps = await db.query('players');
    if (maps.length != null) {
      setState(() {
        this.count = maps.length;
      });

    } else {
      setState(() {
        this.count = 0;
      });
    }
  }
}


答案 1 :(得分:0)

使用FutureBuilder

包裹GridView

类似这样的东西

        {
            "type": "shell",
            "inline": ["sudo bash ~/shell.tmp.sh", "rm ~/shell.tmp.sh"]
        }