gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:00:04 26 4
gpt4 key购买 nike

我有一个使用非常简单的数据库的设置页面,该数据库由几个表组成,用于更改Google map 的外观(google_maps_flutter)。还有一个表,但是该表用于应用程序中的其他功能,在这里我不关心它。我为此使用了moor_flutter和provider包,但是返回值有点困难。

我想做的是检索一个 bool(boolean) 值(在这种情况下)并相应地显示SwitchListTile,但是不幸的是,我遇到了这个错误。

NoSuchMethodError:类“列表”没有实例获取程序“倾斜”。
接收方:“_ 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],
),

最佳答案

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

因为看起来您正在尝试访问tilt上的属性snapshot.data,但是根据您的DAO,data应该是List

DAO返回Stream<List<Parameter>>,因此您的data被解包为List<Parameter>

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

顺便说一句,data可以是null,在访问snapshot.hasData之前检查data是否是一个好主意。

关于android - 如何使用Moor_Flutter从数据库中获取单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59679882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com