list - Flutter 我想重建列表但无法分配
问题描述
我想在 Flutter 中提取数据库并用动态复选框列出它,但是我收到一个错误。有人告诉我通过参考这些链接来重建列表。 https://github.com/tekartik/sqflite/issues/140
但是出现了两个错误。错误:参数类型 'Future<List<Map<dynamic, dynamic>>>' 不能分配给参数类型 '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<List<Map<String, dynamic>>>”类型的变量。和错误:参数类型 'Future<List<Map<dynamic, dynamic>>>' 不能分配给参数类型 'Iterable'。
请告诉如何解决。
解决方案
这一行出现了两个错误:
_data = List.from(getData());
参数类型“Future<List<Map<dynamic, dynamic>>>”不能分配给参数类型“Iterable”
命名工厂构造函数List.of(...)
的第一个参数需要 a Iterable
,但在您的情况下,getData()
是 a Future
,因此发生了错误。
“List”类型的值不能分配给“Future<List<Map<String, dynamic>>>”类型的变量
您的案例中的_data
字段被声明为Future
,但它被分配了List
,因此发生了错误。
要解决它们,请不要使用List.of
. getData()
是一个未来,_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(),
);
}
推荐阅读
- r - 如何通过 quanteda 中至少有 n 个术语的文档过滤 dfm?
- c# - C# UWP TCP 客户端
- node.js - 使用电子获取用户主目录
- postgresql - 用户“ebroot”弹性beantalk的密码认证失败
- python - 从命令中检索参数并将其与列表中的项目匹配
- discord.js - 有没有办法改变参数的顺序?
- python - Pybluez 找不到设备,但 bluetoothctl 可以
- git - 如何在另一个 GitHub 存储库中动态导入 GitHub 存储库?
- javascript - Vue 组件的 prop 未定义(致命错误)
- javascript - ReferenceError:函数未定义,从异步函数调用常规函数