0

我有一个使用非常简单的数据库的设置页面,该数据库由几个表组成,用于更改谷歌地图的外观(google_maps_flutter)。还有一张桌子,但它用于应用程序中的其他东西,我在这里不关心它。我为此使用了 moor_flutter 和提供程序包,但我在返回值时遇到了一点困难。

我想要做的是检索一个布尔值(在这种情况下)并相应地显示 SwitchListTile,但不幸的是,我会收到这个错误。

NoSuchMethodError:类 'List' 没有实例 getter 'tilt'。接收方:“_GrowableList”的实例(长度:0)尝试调用:倾斜。另见:https ://flutter.dev/docs/testing/errors

任何帮助将不胜感激。

这是我的表配置

// 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');
    }*/
  );
}

这是我的道课

@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

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],
 ),
4

1 回答 1

1

这是bool _allowTilt = snapshot.data.tilt;导致错误的行吗?

因为看起来您正在尝试访问 上的属性tiltsnapshot.data但根据您的 DAOdata应该是一个。List

DAO 返回 aStream<List<Parameter>>所以你data被解包到List<Parameter>.

如果表中只有一个条目,您可以通过调用first列表来访问该条目,或者调用watchSingle()DAO 以便您只获得一个条目(如果表中有多个条目,则会引发异常)。或者你必须遍历data.

顺便说一句,data可以null,最好snapshot.hasData在访问之前检查data.

于 2020-01-10T11:04:21.180 回答