【发布时间】:2022-09-27 11:43:21
【问题描述】:
我正在尝试使用 sqflite 存储从 API 获取的数据
现在我收到一条错误消息...
无法从方法 \'getAllEmployees\' 返回类型为 \'List\' 的值,因为它的返回类型为 \'Future<List>\'。
这是我的employee_provider.dart文件
class EmployeeApiProvider {
Future<List<Employee>> getAllEmployees() async {
var url = \"http://demo8161595.mockable.io/employee\";
var response = await Dio().get(url);
return employeeFromJson(response.data).map((employee) {
DBProvider.db.createEmployee(employee);
}).toList();
}
}
如何解决这个问题?
与此相关的其他文件是...
db_provider.dart
class DBProvider {
static Database? _database;
static final DBProvider db = DBProvider._();
DBProvider._();
Future<Database?> get database async {
if (_database != null) return _database;
_database = await initDB();
return _database;
}
initDB() async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
final path = join(documentsDirectory.path, \'employee_manager.db\');
return await openDatabase(path, version: 1, onOpen: (db) {},
onCreate: (Database db, int version) async {
await db.execute(\'CREATE TABLE Employee(\'
\'id INTEGER PRIMARY KEY,\'
\'email TEXT,\'
\'firstName TEXT,\'
\'lastName TEXT,\'
\'avatar TEXT\'
\')\');
});
}
createEmployee(Employee newEmployee) async {
await deleteAllEmployees();
final db = await database;
final res = await db!.insert(\'Employee\', newEmployee.toJson());
return res;
}
Future<int> deleteAllEmployees() async {
final db = await database;
final res = await db!.rawDelete(\'DELETE FROM Employee\');
return res;
}
Future<List<Employee>> getAllEmployees() async {
final db = await database;
final res = await db!.rawQuery(\"SELECT * FROM EMPLOYEE\");
List<Employee> list =
res.isNotEmpty ? res.map((c) => Employee.fromJson(c)).toList() : [];
return list;
}
}
员工模型.dart
List<Employee> employeeFromJson(String str) =>
List<Employee>.from(json.decode(str).map((x) => Employee.fromJson(x)));
String employeeToJson(List<Employee> data) =>
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class Employee {
int id;
String email;
String firstName;
String lastName;
String avatar;
Employee({
required this.id,
required this.email,
required this.firstName,
required this.lastName,
required this.avatar,
});
factory Employee.fromJson(Map<String, dynamic> json) => Employee(
id: json[\"id\"],
email: json[\"email\"],
firstName: json[\"firstName\"],
lastName: json[\"lastName\"],
avatar: json[\"avatar\"],
);
Map<String, dynamic> toJson() => {
\"id\": id,
\"email\": email,
\"firstName\": firstName,
\"lastName\": lastName,
\"avatar\": avatar,
};
}
主页.dart
class _HomeState extends State<AbcView> {
var isLoading = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(\'Api to sqlite\'),
centerTitle: true,
actions: <Widget>[
Container(
padding: const EdgeInsets.only(right: 10.0),
child: IconButton(
icon: const Icon(Icons.settings_input_antenna),
onPressed: () async {
await _loadFromApi();
},
),
),
Container(
padding: const EdgeInsets.only(right: 10.0),
child: IconButton(
icon: const Icon(Icons.delete),
onPressed: () async {
await _deleteData();
},
),
),
],
),
body: isLoading
? const Center(
child: CircularProgressIndicator(),
)
: _buildEmployeeListView(),
);
}
_loadFromApi() async {
setState(() {
isLoading = true;
});
var apiProvider = EmployeeApiProvider();
await apiProvider.getAllEmployees();
await Future.delayed(const Duration(seconds: 2));
setState(() {
isLoading = false;
});
}
_deleteData() async {
setState(() {
isLoading = true;
});
await DBProvider.db.deleteAllEmployees();
await Future.delayed(const Duration(seconds: 1));
setState(() {
isLoading = false;
});
}
_buildEmployeeListView() {
return FutureBuilder(
future: DBProvider.db.getAllEmployees(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return const Center(
child: CircularProgressIndicator(),
);
} else {
return ListView.separated(
separatorBuilder: (context, index) => const Divider(
color: Colors.black12,
),
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
leading: Text(
\"${index + 1}\",
style: const TextStyle(fontSize: 20.0),
),
title: Text(
\"Name: ${snapshot.data[index].firstName} ${snapshot.data[index].lastName} \"),
subtitle: Text(\'EMAIL: ${snapshot.data[index].email}\'),
);
},
);
}
},
);
}
}