【问题标题】:Fetching data from API and storing it to local database error从 API 获取数据并将其存储到本地数据库错误
【发布时间】: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}\'),
              );
            },
          );
        }
      },
    );
  }
}

    标签: flutter api sqflite


    【解决方案1】:

    也许您可以尝试在DBProvider.db.createEmployee 前面添加await

    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) async {
                 await DBProvider.db.createEmployee(employee);
                }).toList();
              }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2017-04-21
      相关资源
      最近更新 更多