颤振 我想重建列表但无法分配



我想在Flutter中提取数据库,并用动态复选框列出它,但我遇到了一个错误。我被告知通过引用这些链接来重建列表。https://github.com/tekartik/sqflite/issues/140

但是出现了两个错误错误:参数类型"Future<列表<映射<动态的,动态的>gt>'无法分配给参数类型"Iterable">。和错误:不能将"List"类型的值分配给"Future"类型的变量

class Classname extends StatefulWidget {
Classname({Key key}) : super(key: key);
@override
createState() => _ClassnameState();
}
class _ClassnameState extends State<Classname> {
String test;
String test2;
String test3;
bool isChecked = false;
Future _data;
@override
void initState() {
_data = List.from(getData());
super.initState();
}
Future<List<Map>> getData() async {
String path = join(await getDatabasesPath(), 'dbname.db');
Database database = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
await db.execute(
"CREATE TABLE tablename(id INTEGER PRIMARY KEY, test TEXT, test2 TEXT, test3 TEXT)");
});
List<Map> result = await database.rawQuery('SELECT * FROM tablename');
return result;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder<List<Map>>(
future: _data,
builder: (context, result) {
      if (result.connectionState == ConnectionState.waiting) {
return Center(
child:
CircularProgressIndicator());
}
if (!result.hasData) {
return Center(
child: Text(
'no data'),
);
}
return SingleChildScrollView(
child: Container(
child: Column(
children: List.generate(result.data.length, (index) {
var data = result.data[index];
test = data['test'];
test2 = data['test2'];
test3 = data['test3'];
data.putIfAbsent('isChecked', () => false);
return Column(
children: [
Row(
children: <Widget>[
Checkbox(
value: data['isChecked'],
onChanged: (bool value) {
setState(() {
data['isChecked'] = value;
});
},
),
Container(
child: Text(
test,
),
),
Container(
child: Text(test2),
),
],
),
Align(
alignment: Alignment.centerLeft,
child: Text(
test3,
),
),
],
);
}),
),
),
);
},
),
);
}
}

因此,我也尝试更改变量的定义,如Future<List<Map>> _data等,但出现了错误。在上述情况下,错误:不能将类型为'List'的值分配给类型为'Future<列表<映射<字符串,动态>gt>'。和错误:参数类型'Future<列表<映射<动态的,动态的>gt>'无法分配给参数类型"Iterable">

请说明如何解决。

这一行出现两个错误:

_data = List.from(getData());

参数类型'Future<列表<映射<动态的,动态的>gt>'无法分配给参数类型"Iterable">

命名工厂构造函数List.of(...)的第一个参数需要Iterable,但在您的情况下,getData()Future,因此发生了错误。

不能将"List"类型的值分配给"Future<列表<映射<字符串,动态>gt>'

您的案例中的_data字段被声明为Future,但它被分配了List,因此发生了错误。

要解决这些问题,请不要使用List.ofgetData()是未来,而_data正需要它

@override
void initState() {
super.initState();
_data = getData();
}

另一种方法是使用result列表。删除FutureBuilder,将Future _data更改为List _data,并将其在getData中的值指定为result

List _data;
@override
void initState() {
super.initState();
getData();
}
Future<void> getData() async {
String path = join(await getDatabasesPath(), 'dbname.db');
Database database = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
await db.execute(
"CREATE TABLE tablename(id INTEGER PRIMARY KEY, test TEXT, test2 TEXT, test3 TEXT)");
});
List<Map> result = await database.rawQuery('SELECT * FROM tablename');
setState((){
_data = result;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: _data == null 
? CircularProgressIndicator()
: _data.isEmpty()
? Center(child: Text('no data'))
: SingleChildScrollView(),
);
}

相关内容

  • 没有找到相关文章

最新更新