Android 如何使用Moor_Flutter从数据库中获取单个值

Android 如何使用Moor_Flutter从数据库中获取单个值,android,database,flutter,dart,flutter-moor,Android,Database,Flutter,Dart,Flutter Moor,我有一个设置页面,它使用一个非常简单的数据库,它由两个表组成,可以改变谷歌地图的外观。还有一个表,但它用于应用程序中的其他内容,我这里不关心它。我正在为此使用moor_颤振和提供程序包,但返回值有点困难 在这种情况下,我想做的是检索一个布尔值并相应地显示SwitchListTile,但不幸的是,我无法得到这个错误 NoSuchMethodError:类“List”没有实例获取程序“tilt”。 Receiver:Instancelength:0(属于“\u GrowtableList”)尝试呼叫

我有一个设置页面,它使用一个非常简单的数据库,它由两个表组成,可以改变谷歌地图的外观。还有一个表,但它用于应用程序中的其他内容,我这里不关心它。我正在为此使用moor_颤振和提供程序包,但返回值有点困难

在这种情况下,我想做的是检索一个布尔值并相应地显示SwitchListTile,但不幸的是,我无法得到这个错误

NoSuchMethodError:类“List”没有实例获取程序“tilt”。 Receiver:Instancelength:0(属于“\u GrowtableList”)尝试呼叫:tilt。 另见:

任何帮助都将不胜感激

这是我的表格配置

// Map Parameters table definition
class Parameters extends Table {
  BoolColumn get tilt => boolean().withDefault(Constant(true))();
  BoolColumn get traffic => boolean().withDefault(Constant(false))();
  BoolColumn get compass => boolean().withDefault(Constant(true))();
  BoolColumn get rotate => boolean().withDefault(Constant(true))();
  BoolColumn get zoom => boolean().withDefault(Constant(true))();
  /*TextColumn get type => text().named('normal')();
  TextColumn get area => text().named('Uni Campus')();*/
}
这是我的AppDatabase类

// App Database Class
@UseMoor(
    tables: [Parameters, Themes, Places],
    daos: [ParameterDao, ThemeDao, PlaceDao])
class AppDatabase extends _$AppDatabase {
  AppDatabase()
      : super(FlutterQueryExecutor.inDatabaseFolder(
            path: 'db.sqlite', logStatements: true));

  // Database Schema Version
  @override
  int get schemaVersion => 1; // Change this with every DB change

  @override
  MigrationStrategy get migration => MigrationStrategy(
    onUpgrade: (migrator, from, to) async{
      if(from == 1){
        // await migrator.addColumn(<table, <table>.<fieldName>);
        // await migrator.createTable(<table>);
      }
    },
    /*beforeOpen: (db,details) async {
      await db.customStatement('PRAGMA foreign_keys = ON');
    }*/
  );
}
这是bool_allowTilt=snapshot.data.tilt;导致错误的行

因为看起来您正试图访问snapshot.data上的属性,但数据应该是符合DAO的列表

DAO返回一个流,以便将数据解包到列表中

如果表中只有一个条目,则可以通过调用列表中的第一个条目来访问该条目,或者在DAO中调用watchSingle,这样,如果表中有多个条目,则只有一个条目将引发异常。或者你必须在数据上循环


顺便说一下,数据可以为空,在访问数据之前检查snapshot.hasData是否为空是一个好主意。

是,这是导致错误的那一行。如果我硬编码一个值,比如bool _AllowTilt=true,那么一切都很好。我将检查快照是否有数据,但即使有默认值,数据也可以为null吗?我认为我已经正确地添加了默认值。谢谢lyio-我很感谢你的时间。
@UseDao(tables: [Parameters])
class ParameterDao extends DatabaseAccessor<AppDatabase> with _$ParameterDaoMixin {
  final AppDatabase db;

  ParameterDao(this.db) : super(db);

  // Map parameters queries
  Future<List<Parameter>> getAllParameters() => select(parameters).get();
  Stream<List<Parameter>> watchAllParameters() => select(parameters).watch();
  Future updateParameter(Parameter parameter, {bool tilt}) =>
      update(parameters).replace(parameter);
}
@override
  Widget build(BuildContext context) {
    final dao = Provider.of<ParameterDao>(context);
    return StreamBuilder(
        stream: dao.watchAllParameters(),
        builder: (context, AsyncSnapshot snapshot) {
          bool _allowTilt = snapshot.data.tilt;
          bool _enableRotate = true;
          bool _enableZoom = true;
          bool _showTraffic = false;
          bool _showCompass = true;
          return Container(
            child: DecoratedBox(
              decoration: BoxDecoration(
              ...
              ...
              ...
SwitchListTile(
    value: _allowTilt,
    onChanged: (value) {
        setState(() {
            // _allowTilt = value;
            //_db.updateParameter(tilt: _allowTilt);
            //print("ALLOW TILT => _allowTilt");
        });
    },
    title: Text(
        AppLocalizations.of(context).settingsLabelTilt),
    activeColor: Theme.UniColour.primary[900],
 ),