首页 > 解决方案 > 无法使用静态访问访问实例成员

问题描述

我希望你们一切都好!

我遇到了关于我的 Flutter 应用程序的问题:我一直在关注 Youtube 上关于如何在 Flutter 中使用 sqflite的教程,但我无法让我的 toMap 函数在我的数据库类中工作......它总是返回给我错误“无法使用静态访问访问实例成员“toMap”。有谁知道这是关于什么的?我真的不明白......提前谢谢!

在下面,有问题的代码:

点心

final String tablePOI = 'poi';

class POIFields {
  static final String id = '_id';
  static final String email = 'email';
  static final String village = 'village';
  static final String lieu = 'lieu';
  static final String type = 'type';
  static final String etat = 'etat';
  static final String notes = 'notes';
  static final String latitude = 'latitude';
  static final String longitude = 'longitude';
  static final String imageUrl = 'image_url';
}

class POI {

  final int id;
  final String email;
  final String village;
  final String lieu;
  final String type;
  final String etat;
  final String notes;
  final String latitude;
  final String longitude;
  final String imageUrl;

  POI({this.id, this.email, this.village, this.lieu, this.type, this.etat, this.notes, this.latitude, this.longitude, this.imageUrl});

   Map<String, Object> toMap() => {
     POIFields.id: id,
     POIFields.email: email,
     POIFields.village: village,
     POIFields.lieu: lieu,
     POIFields.type: type,
     POIFields.etat: etat,
     POIFields.notes: notes,
     POIFields.latitude: latitude,
     POIFields.longitude: longitude,
     POIFields.imageUrl: imageUrl,
  };

  String toString() {
    return 'POI{id: $id, email: $email, village: $village, lieu: $lieu, type: $type, etat: $etat, notes: $notes, latitude: $latitude, longitude: $longitude, image_url: $imageUrl}';
  }

}

poi_db.dart

import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:stage_app_mpc/models/poi.dart';

class POIDatabase {
  static final POIDatabase instance = POIDatabase._init();
  static Database _database;
  POIDatabase._init();

  Future<Database> get database async {
    if (_database != null) {
      return _database;
    }
    else {
      _database = await _initDB('poi.db');
      return _database;
    }
  }

  Future<Database> _initDB(String filePath) async {
    final dbPath = await getDatabasesPath();
    final path = join(dbPath, filePath);
    return openDatabase(path, version: 1, onCreate: _createDB);
  }

  Future _createDB(Database db, int version) async {
    await db.execute('CREATE TABLE poi (id INTEGER PRIMARY KEY, email TEXT, village TEXT, lieu TEXT, type TEXT, etat TEXT, notes TEXT, latitude TEXT, longitude TEXT, image_url TEXT)');
  }

  Future<POI> create(POI poi) async {
    final db = await instance.database;
    final id = await db.insert('poi', POI.toMap());
  }

  Future closeDB() async {
    final db = await instance.database;
    db.close();
  }

}

标签: sqldatabaseflutterdartsqflite

解决方案


您引用的是类POI而不是参数poi

  Future<POI> create(POI poi) async {
    final db = await instance.database;
    final id = await db.insert('poi', POI.toMap());
  }

您应该更改它以引用您传入的参数。

  Future<POI> create(POI poi) async {
    final db = await instance.database;
    final id = await db.insert('poi', poi.toMap());
  }

注意:我建议,为避免将来出现此类混淆,请使用较少的缩写来命名您的类。它有助于尽可能描述性地命名它们。然后对于实例变量,您可以使用缩短的符号(尽管我仍然会尝试以描述性的方式命名事物以了解它是如何使用的)。

在这种情况下,无论 POI 代表什么:感兴趣的地方?

class PlaceOfInterest {...}

那么您的参数或字段可能是currentPoi, activePoi, poiData, 等等...


推荐阅读