Flutter 参数类型';未来<&燃气轮机';can';不能分配给参数类型'';
我正在尝试建立一个GridView列表。当我创建一个简单的“玩家”列表时,这一切都会起作用,但现在我试图使用sqflite持久化数据,我得到了一个错误: 错误:参数类型“Future”无法分配给参数类型“int” 这是我的列表生成器小部件:Flutter 参数类型';未来<&燃气轮机';can';不能分配给参数类型'';,flutter,future,sqflite,flutter-change-notifier,Flutter,Future,Sqflite,Flutter Change Notifier,我正在尝试建立一个GridView列表。当我创建一个简单的“玩家”列表时,这一切都会起作用,但现在我试图使用sqflite持久化数据,我得到了一个错误: 错误:参数类型“Future”无法分配给参数类型“int” 这是我的列表生成器小部件: class PlayerList extends StatelessWidget { @override Widget build(BuildContext context) { return Consumer<PlayerData&g
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);
});
});
},
);
}
}
class PlayerList扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
退货消费者(
生成器:(上下文、玩家数据、子对象){
返回GridView.builder(
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
平均间距:20,
横轴间距:20,
),
itemCount:playerData.playerCount,
itemBuilder:(构建上下文,int索引){
最终玩家=玩家数据。玩家[索引];
返回原材料按钮(
填充颜色:颜色(0x991c5597),
海拔:20,
形状:圆形矩形边框(
边界半径:边界半径。圆形(10),
),
孩子:填充(
填充:常数边集全部(10.0),
子:列(
crossAxisAlignment:crossAxisAlignment.center,
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
圆形(
背景颜色:Colors.tealacent,
半径:30,
子:图标(
明星,
颜色:颜色(0xFF16377a),
尺码:30,
),
),
文本(player.name,样式:smallTitleText),
],
),
),
已按下:(){
playerData.makeActive(player.name);
playerData.printList();
Navigator.pushName(上下文,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;}
}
Future get playerCount async{
final Database db=wait getDBConnector();
最终列表映射=等待db.query('players');
if(maps.length!=null){
返回映射长度;
}else{return 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;
});
}
}
}
类PlayerList扩展StatefulWidget{
@凌驾
_PlayerListState createState()=>PlayerListState();
}
类_PlayerListState扩展状态{
整数计数;
@凌驾
void initState(){
super.initState();
loadPlayerCount();
}
@凌驾
小部件构建(构建上下文){
退货消费者(
生成器:(上下文、玩家数据、子对象){
返回GridView.builder(
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
平均间距:20,
横轴间距:20,
),
itemCount:计数??0,
itemBuilder:(构建上下文,int索引){
最终玩家=玩家数据。玩家[索引];
返回原材料按钮(
填充颜色:颜色(0x991c5597),
海拔:20,
形状:圆形矩形边框(
边界半径:边界半径。圆形(10),
),
孩子:填充(
填充:常数边集全部(10.0),
子:列(
crossAxisAlignment:crossAxisAlignment.center,
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
圆形(
背景颜色:Colors.tealacent,
半径:30,
子:图标(
明星,
颜色:颜色(0xFF16377a),
尺码:30,
),
),
文本(player.name,样式:smallTitleText),
],
),
),
已按下:(){
playerData.makeActive(player.name);
playerData.printList();
Navigator.pushName(上下文,PlayScreen.id);
});
});
},
);
}
void loadPlayerCount()异步{
final Database db=wait getDBConnector();
最终列表映射=等待db.query('players');
if(maps.length!=null){
设置状态(){
this.count=maps.length;
});
}否则{
设置状态(){
此值为0.count;
});
}
}
}
用
像这样的
return FutureBuilder(
future: playerData.playerCount,
builder : (context,snapshot){
if(!(snapshot.hasData)){
return Container();
}
else{
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 20,
crossAxisSpacing: 20,
),
itemCount: snapshot.data,
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);
});
});
},
);
}
}
);
返回FutureBuilder(
未来:playerData.playerCount,
生成器:(上下文,快照){
如果(!(snapshot.hasData)){
返回容器();
}
否则{
返回GridView.builder(
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
平均间距:20,
横轴间距:20,
),
itemCount:snapshot.data,
itemBuilder:(构建上下文,int索引){
最终玩家=玩家数据。玩家[索引];
返回原材料按钮(
填充颜色:颜色(0x991c5597),
海拔:20,
形状:圆形矩形边框(
边界半径:边界半径。圆形(10),
),
孩子:填充(
填充:常数边集