Flutter:为什么这个函数内部的方法没有访问数据库变量?

Flutter: Why are the methods inside this function not accessing the database variable?

我有一个名为 database_services.dart 的文件。这个文件有一个 class 和各种方法。第一种方法打开数据库并存储引用,而其他方法则对该数据库进行包含、更新和删除。问题是其他方法无法看到第一种方法创建的数据库。我错过了什么?

代码如下:

import 'dart:async';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'counter.dart';

class DatabaseServices {
  initDatabase() async {
    // Open the database and store the reference.
    final Future<Database> database = openDatabase(
      // Set the path to the database.
      join(await getDatabasesPath(), 'counter_database.db'),
      // When the database is first created, create a table to store counters;
      onCreate: (db, version) {
        // Run the CREATE TABLE statement on the database.
        return db.execute(
          "CREATE TABLE counters(id INTEGER PRIMARY KEY, name TEXT, value INTEGER)",
        );
      },
      // Set the version. This executes the onCreate function and provides a
      // path to perform database upgrades and downgrades.
      version: 1,
    );
  }

    // Define a function that inserts counters into the database.
    Future<void> insertCounter(Counter counter) async {
      // Get a reference to the database.
      final Database db = await database;
      // Insert the Counter into the correct table. Here, if a counter is inserted twice,
      // it replace any previous data.
      await db.insert(
        'counters',
        counter.toMap(),
        conflictAlgorithm: ConflictAlgorithm.replace,
      );
    }
}
    // A method that retrieves all the counters from the counters table.
    Future<List<Counter>> counters() async {
      // Get a reference to the database.
      final Database db = await database;
      // Query the table for all the Counters.
      final List<Map<String, dynamic>> maps = await db.query('counters');
      // Counvert the List<Map<String, dynamic>> into a List<Counter>
      return List.generate(maps.length, (i) {
        return Counter(
          id: maps[i]['id'],
          name: maps[i]['name'],
          value: maps[i]['value'],
        );
      });
    }

    // Method to update a Counter in the database
    Future<void> updateCounter(Counter counter) async {
      final db = await database;
      await db.update(
        'counters',
        counter.toMap(),
        where: "id = ?",
        whereArgs: [counter.id],
      );
    }

    //Delete a Counter from the database
    Future<void> deleteCounter(int id) async {
      final db = await database;
      await db.delete(
        'counters',
        where: "id = ?",
        whereArgs: [id],
      );
    }
}

database 变量仅存储在 initDatabase 方法中,而不是在 DatabaseServices class 中,这意味着它只能从 initDatabase方法。

下面的代码示例显示了如何将 database 作为 属性 存储在 DatabaseServices class 上,这将允许所有class.

里面的方法
class DatabaseServices {
  Future<Database> _db;

  Future<void> initDatabase() async {
    // Open the database and store the reference.
    _db = openDatabase(
      // Set the path to the database.
      join(await getDatabasesPath(), 'counter_database.db'),
      // When the database is first created, create a table to store counters;
      onCreate: (db, version) {
        // Run the CREATE TABLE statement on the database.
        return db.execute(
          "CREATE TABLE counters(id INTEGER PRIMARY KEY, name TEXT, value INTEGER)",
        );
      },
      // Set the version. This executes the onCreate function and provides a
      // path to perform database upgrades and downgrades.
      version: 1,
    );
  }

  // Define a function that inserts counters into the database.
  Future<void> insertCounter(Counter counter) async {
    // Get a reference to the database.
    final db = await _db;
    // Insert the Counter into the correct table. Here, if a counter is inserted twice,
    // it replace any previous data.
    await db.insert(
      'counters',
      counter.toMap(),
      conflictAlgorithm: ConflictAlgorithm.replace,
    );
  }

  // A method that retrieves all the counters from the counters table.
  Future<List<Counter>> counters() async {
    // Get a reference to the database.
    final db = await _db;
    // Query the table for all the Counters.
    final List<Map<String, dynamic>> maps = await db.query('counters');
    // Counvert the List<Map<String, dynamic>> into a List<Counter>
    return List.generate(maps.length, (i) {
      return Counter(
        id: maps[i]['id'],
        name: maps[i]['name'],
        value: maps[i]['value'],
      );
    });
  }

  // Method to update a Counter in the database
  Future<void> updateCounter(Counter counter) async {
    final db = await _db;
    await db.update(
      'counters',
      counter.toMap(),
      where: "id = ?",
      whereArgs: [counter.id],
    );
  }

  //Delete a Counter from the database
  Future<void> deleteCounter(int id) async {
    final db = await _db;
    await db.delete(
      'counters',
      where: "id = ?",
      whereArgs: [id],
    );
  }
}

您可以找到有关打开数据库的更多信息here