initial commit v3

This commit is contained in:
reinjens 2024-09-24 15:29:01 +02:00
parent d5e6b853b3
commit 93be864bd3
17 changed files with 677 additions and 613 deletions

View file

@ -1,7 +1,7 @@
import 'package:ambito/src/domain/entity/baumarten/baumarten.dart';
import 'package:ambito/src/domain/entity/massnahme/massnahme.dart';
import 'package:ambito/src/packages/ambito_api/base.dart';
import 'package:ambito/src/pages/actions/actions_page.dart';
import 'package:ambito/src/pages/start/start_page.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_i18n/flutter_i18n.dart';
@ -9,7 +9,7 @@ import 'package:get/get_navigation/src/root/get_material_app.dart';
import 'package:isar/isar.dart';
import 'package:logger/logger.dart';
final String AmbitoToken = 'TFxO7vzBLVRCu9I3VMoHmTuCvSu8aCDi';
const String ambitoToken = 'TFxO7vzBLVRCu9I3VMoHmTuCvSu8aCDi';
final Logger logger = Logger(
printer: PrettyPrinter(),
@ -20,11 +20,6 @@ late Isar isar;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
/*Isar.open(
schemas: [BaumartenSchema, IdValueColorSchema, IdValueSchema],
directory: '',
);*/
await Isar.initialize();
const dir = Isar.sqliteInMemory;
const engine = kIsWeb ? IsarEngine.sqlite : IsarEngine.isar;
@ -59,7 +54,9 @@ class Ambito extends StatelessWidget {
basePath: 'i18n',
),
missingTranslationHandler: (key, locale) {
print("--- Missing Key: $key, languageCode: $locale");
if (kDebugMode) {
print("--- Missing Key: $key, languageCode: $locale");
}
},
),
],
@ -70,88 +67,7 @@ class Ambito extends StatelessWidget {
scaffoldBackgroundColor: Colors.white,
useMaterial3: true,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String activeLink = '';
@override
void initState() {
activeLink = 'start';
super.initState();
}
@override
Widget build(BuildContext context) {
double fontSize = 16;
return Scaffold(
body: Column(
children: [
SizedBox(height: 50),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
LinkButton('start'),
LinkButton('database'),
LinkButton('designer'),
Image.asset(
'images/logo.png',
scale: 1.3,
),
LinkButton('service'),
LinkButton('network'),
LinkButton('contact'),
],
),
SizedBox(height: 50),
Expanded(
child: getContent(),
),
],
));
}
Widget getContent() {
if (activeLink == 'database') {
return ActionsPage();
}
return Text(activeLink);
}
Widget LinkButton(String link) {
double fontSize = 16;
return TextButton(
style: ButtonStyle(
overlayColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) {
return Colors.white;
}),
),
onPressed: () {
setState(() {
activeLink = link;
});
},
child: Text(
context.translate('page.start.links.$link.title'),
style: TextStyle(
fontSize: fontSize,
fontWeight: FontWeight.bold,
color: (activeLink == link)
? Colors.grey.shade400
: Colors.grey.shade800,
),
),
home: const StartPage(),
);
}
}

View file

@ -45,13 +45,20 @@ class Baumarten extends BaseEntity {
String? waterlevel;
@JsonKey(name: 'Bodenfeuchte')
List<IdValueColor>? humidity;
String? Lichtzahl;
String? Temperaturzahl;
String? Feuchtezahl;
String? Reaktionszahl;
String? Stickstoffzahl;
List<IdValueColor>? Region;
String? Anmerkung;
@JsonKey(name: 'Lichtzahl')
String? valueLight;
@JsonKey(name: 'Temperaturzahl')
String? valueTemperature;
@JsonKey(name: 'Feuchtezahl')
String? valueHumidity;
@JsonKey(name: 'Reaktionszahl')
String? valueReaction;
@JsonKey(name: 'Stickstoffzahl')
String? valueNitrogen;
@JsonKey(name: 'Region')
List<IdValueColor>? region;
@JsonKey(name: 'Anmerkung')
String? note;
@JsonKey(name: "Wild/Kulturart")
String? typeOfCulture;
@JsonKey(name: 'Gebiet 1')

File diff suppressed because it is too large Load diff

View file

@ -11,14 +11,20 @@ class FilePart {
String? url;
Thumbnails? thumbnails;
String? visible_name;
@JsonKey(name: 'visible_name')
String? visibleName;
String? name;
int? size;
String? mime_type;
bool? is_image;
int? image_width;
int? image_height;
String? uploaded_at;
@JsonKey(name: 'mime_type')
String? mimeType;
@JsonKey(name: 'is_image')
bool? isImage;
@JsonKey(name: 'image_width')
int? imageWidth;
@JsonKey(name: 'image_height')
int? imageHeight;
@JsonKey(name: 'uploaded_at')
String? uploadedAt;
factory FilePart.fromJson(Map<String, dynamic> json) =>
_$FilePartFromJson(json);

View file

@ -25,7 +25,7 @@ const FilePartSchema = IsarGeneratedSchema(
target: 'Thumbnails',
),
IsarPropertySchema(
name: 'visible_name',
name: 'visibleName',
type: IsarType.string,
),
IsarPropertySchema(
@ -37,23 +37,23 @@ const FilePartSchema = IsarGeneratedSchema(
type: IsarType.long,
),
IsarPropertySchema(
name: 'mime_type',
name: 'mimeType',
type: IsarType.string,
),
IsarPropertySchema(
name: 'is_image',
name: 'isImage',
type: IsarType.bool,
),
IsarPropertySchema(
name: 'image_width',
name: 'imageWidth',
type: IsarType.long,
),
IsarPropertySchema(
name: 'image_height',
name: 'imageHeight',
type: IsarType.long,
),
IsarPropertySchema(
name: 'uploaded_at',
name: 'uploadedAt',
type: IsarType.string,
),
],
@ -86,7 +86,7 @@ int serializeFilePart(IsarWriter writer, FilePart object) {
}
}
{
final value = object.visible_name;
final value = object.visibleName;
if (value == null) {
IsarCore.writeNull(writer, 3);
} else {
@ -103,7 +103,7 @@ int serializeFilePart(IsarWriter writer, FilePart object) {
}
IsarCore.writeLong(writer, 5, object.size ?? -9223372036854775808);
{
final value = object.mime_type;
final value = object.mimeType;
if (value == null) {
IsarCore.writeNull(writer, 6);
} else {
@ -111,17 +111,17 @@ int serializeFilePart(IsarWriter writer, FilePart object) {
}
}
{
final value = object.is_image;
final value = object.isImage;
if (value == null) {
IsarCore.writeNull(writer, 7);
} else {
IsarCore.writeBool(writer, 7, value);
}
}
IsarCore.writeLong(writer, 8, object.image_width ?? -9223372036854775808);
IsarCore.writeLong(writer, 9, object.image_height ?? -9223372036854775808);
IsarCore.writeLong(writer, 8, object.imageWidth ?? -9223372036854775808);
IsarCore.writeLong(writer, 9, object.imageHeight ?? -9223372036854775808);
{
final value = object.uploaded_at;
final value = object.uploadedAt;
if (value == null) {
IsarCore.writeNull(writer, 10);
} else {
@ -145,7 +145,7 @@ FilePart deserializeFilePart(IsarReader reader) {
object.thumbnails = embedded;
}
}
object.visible_name = IsarCore.readString(reader, 3);
object.visibleName = IsarCore.readString(reader, 3);
object.name = IsarCore.readString(reader, 4);
{
final value = IsarCore.readLong(reader, 5);
@ -155,31 +155,31 @@ FilePart deserializeFilePart(IsarReader reader) {
object.size = value;
}
}
object.mime_type = IsarCore.readString(reader, 6);
object.mimeType = IsarCore.readString(reader, 6);
{
if (IsarCore.readNull(reader, 7)) {
object.is_image = null;
object.isImage = null;
} else {
object.is_image = IsarCore.readBool(reader, 7);
object.isImage = IsarCore.readBool(reader, 7);
}
}
{
final value = IsarCore.readLong(reader, 8);
if (value == -9223372036854775808) {
object.image_width = null;
object.imageWidth = null;
} else {
object.image_width = value;
object.imageWidth = value;
}
}
{
final value = IsarCore.readLong(reader, 9);
if (value == -9223372036854775808) {
object.image_height = null;
object.imageHeight = null;
} else {
object.image_height = value;
object.imageHeight = value;
}
}
object.uploaded_at = IsarCore.readString(reader, 10);
object.uploadedAt = IsarCore.readString(reader, 10);
return object;
}
@ -383,20 +383,20 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameIsNull() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 3));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameIsNotNull() {
visibleNameIsNotNull() {
return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 3));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameEqualTo(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameEqualTo(
String? value, {
bool caseSensitive = true,
}) {
@ -412,7 +412,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameGreaterThan(
visibleNameGreaterThan(
String? value, {
bool caseSensitive = true,
}) {
@ -428,7 +428,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameGreaterThanOrEqualTo(
visibleNameGreaterThanOrEqualTo(
String? value, {
bool caseSensitive = true,
}) {
@ -443,7 +443,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameLessThan(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameLessThan(
String? value, {
bool caseSensitive = true,
}) {
@ -459,7 +459,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameLessThanOrEqualTo(
visibleNameLessThanOrEqualTo(
String? value, {
bool caseSensitive = true,
}) {
@ -474,7 +474,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameBetween(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameBetween(
String? lower,
String? upper, {
bool caseSensitive = true,
@ -491,8 +491,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameStartsWith(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameStartsWith(
String value, {
bool caseSensitive = true,
}) {
@ -507,7 +506,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameEndsWith(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameEndsWith(
String value, {
bool caseSensitive = true,
}) {
@ -522,7 +521,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameContains(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@ -536,7 +535,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameMatches(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@ -550,8 +549,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameIsEmpty() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
@ -563,7 +561,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameIsNotEmpty() {
visibleNameIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
@ -852,19 +850,19 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeIsNull() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 6));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeIsNotNull() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeIsNotNull() {
return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 6));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeEqualTo(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeEqualTo(
String? value, {
bool caseSensitive = true,
}) {
@ -879,7 +877,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeGreaterThan(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeGreaterThan(
String? value, {
bool caseSensitive = true,
}) {
@ -895,7 +893,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
mime_typeGreaterThanOrEqualTo(
mimeTypeGreaterThanOrEqualTo(
String? value, {
bool caseSensitive = true,
}) {
@ -910,7 +908,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeLessThan(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeLessThan(
String? value, {
bool caseSensitive = true,
}) {
@ -926,7 +924,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
mime_typeLessThanOrEqualTo(
mimeTypeLessThanOrEqualTo(
String? value, {
bool caseSensitive = true,
}) {
@ -941,7 +939,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeBetween(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeBetween(
String? lower,
String? upper, {
bool caseSensitive = true,
@ -958,7 +956,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeStartsWith(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeStartsWith(
String value, {
bool caseSensitive = true,
}) {
@ -973,7 +971,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeEndsWith(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeEndsWith(
String value, {
bool caseSensitive = true,
}) {
@ -988,7 +986,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeContains(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@ -1002,7 +1000,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeMatches(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@ -1016,7 +1014,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeIsEmpty() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
@ -1027,8 +1025,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
mime_typeIsNotEmpty() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
@ -1039,19 +1036,19 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> is_imageIsNull() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> isImageIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 7));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> is_imageIsNotNull() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> isImageIsNotNull() {
return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 7));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> is_imageEqualTo(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> isImageEqualTo(
bool? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1064,20 +1061,20 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_widthIsNull() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 8));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_widthIsNotNull() {
imageWidthIsNotNull() {
return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 8));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_widthEqualTo(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthEqualTo(
int? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1090,8 +1087,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_widthGreaterThan(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthGreaterThan(
int? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1105,7 +1101,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_widthGreaterThanOrEqualTo(
imageWidthGreaterThanOrEqualTo(
int? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1118,7 +1114,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_widthLessThan(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthLessThan(
int? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1132,7 +1128,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_widthLessThanOrEqualTo(
imageWidthLessThanOrEqualTo(
int? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1145,7 +1141,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_widthBetween(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthBetween(
int? lower,
int? upper,
) {
@ -1160,20 +1156,20 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightIsNull() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 9));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_heightIsNotNull() {
imageHeightIsNotNull() {
return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 9));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightEqualTo(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightEqualTo(
int? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1187,7 +1183,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_heightGreaterThan(
imageHeightGreaterThan(
int? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1201,7 +1197,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_heightGreaterThanOrEqualTo(
imageHeightGreaterThanOrEqualTo(
int? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1214,7 +1210,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightLessThan(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightLessThan(
int? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1228,7 +1224,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_heightLessThanOrEqualTo(
imageHeightLessThanOrEqualTo(
int? value,
) {
return QueryBuilder.apply(this, (query) {
@ -1241,7 +1237,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightBetween(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightBetween(
int? lower,
int? upper,
) {
@ -1256,20 +1252,20 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atIsNull() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 10));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
uploaded_atIsNotNull() {
uploadedAtIsNotNull() {
return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 10));
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atEqualTo(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtEqualTo(
String? value, {
bool caseSensitive = true,
}) {
@ -1284,8 +1280,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
uploaded_atGreaterThan(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtGreaterThan(
String? value, {
bool caseSensitive = true,
}) {
@ -1301,7 +1296,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
uploaded_atGreaterThanOrEqualTo(
uploadedAtGreaterThanOrEqualTo(
String? value, {
bool caseSensitive = true,
}) {
@ -1316,7 +1311,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atLessThan(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtLessThan(
String? value, {
bool caseSensitive = true,
}) {
@ -1332,7 +1327,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
uploaded_atLessThanOrEqualTo(
uploadedAtLessThanOrEqualTo(
String? value, {
bool caseSensitive = true,
}) {
@ -1347,7 +1342,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atBetween(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtBetween(
String? lower,
String? upper, {
bool caseSensitive = true,
@ -1364,7 +1359,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atStartsWith(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtStartsWith(
String value, {
bool caseSensitive = true,
}) {
@ -1379,7 +1374,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atEndsWith(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtEndsWith(
String value, {
bool caseSensitive = true,
}) {
@ -1394,7 +1389,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atContains(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@ -1408,7 +1403,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atMatches(
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@ -1422,7 +1417,7 @@ extension FilePartQueryFilter
});
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atIsEmpty() {
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
@ -1434,7 +1429,7 @@ extension FilePartQueryFilter
}
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
uploaded_atIsNotEmpty() {
uploadedAtIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
@ -1465,24 +1460,24 @@ FilePart _$FilePartFromJson(Map<String, dynamic> json) => FilePart()
..thumbnails = json['thumbnails'] == null
? null
: Thumbnails.fromJson(json['thumbnails'] as Map<String, dynamic>)
..visible_name = json['visible_name'] as String?
..visibleName = json['visible_name'] as String?
..name = json['name'] as String?
..size = (json['size'] as num?)?.toInt()
..mime_type = json['mime_type'] as String?
..is_image = json['is_image'] as bool?
..image_width = (json['image_width'] as num?)?.toInt()
..image_height = (json['image_height'] as num?)?.toInt()
..uploaded_at = json['uploaded_at'] as String?;
..mimeType = json['mime_type'] as String?
..isImage = json['is_image'] as bool?
..imageWidth = (json['image_width'] as num?)?.toInt()
..imageHeight = (json['image_height'] as num?)?.toInt()
..uploadedAt = json['uploaded_at'] as String?;
Map<String, dynamic> _$FilePartToJson(FilePart instance) => <String, dynamic>{
'url': instance.url,
'thumbnails': instance.thumbnails?.toJson(),
'visible_name': instance.visible_name,
'visible_name': instance.visibleName,
'name': instance.name,
'size': instance.size,
'mime_type': instance.mime_type,
'is_image': instance.is_image,
'image_width': instance.image_width,
'image_height': instance.image_height,
'uploaded_at': instance.uploaded_at,
'mime_type': instance.mimeType,
'is_image': instance.isImage,
'image_width': instance.imageWidth,
'image_height': instance.imageHeight,
'uploaded_at': instance.uploadedAt,
};

View file

@ -11,7 +11,8 @@ class Thumbnails {
Thumbnail? tiny;
Thumbnail? small;
Thumbnail? card_cover;
@JsonKey(name: 'card_cover')
Thumbnail? cardCover;
factory Thumbnails.fromJson(Map<String, dynamic> json) =>
_$ThumbnailsFromJson(json);

View file

@ -26,7 +26,7 @@ const ThumbnailsSchema = IsarGeneratedSchema(
target: 'Thumbnail',
),
IsarPropertySchema(
name: 'card_cover',
name: 'cardCover',
type: IsarType.object,
target: 'Thumbnail',
),
@ -62,7 +62,7 @@ int serializeThumbnails(IsarWriter writer, Thumbnails object) {
}
}
{
final value = object.card_cover;
final value = object.cardCover;
if (value == null) {
IsarCore.writeNull(writer, 3);
} else {
@ -100,11 +100,11 @@ Thumbnails deserializeThumbnails(IsarReader reader) {
{
final objectReader = IsarCore.readObject(reader, 3);
if (objectReader.isNull) {
object.card_cover = null;
object.cardCover = null;
} else {
final embedded = deserializeThumbnail(objectReader);
IsarCore.freeReader(objectReader);
object.card_cover = embedded;
object.cardCover = embedded;
}
}
return object;
@ -137,14 +137,14 @@ extension ThumbnailsQueryFilter
}
QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition>
card_coverIsNull() {
cardCoverIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 3));
});
}
QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition>
card_coverIsNotNull() {
cardCoverIsNotNull() {
return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 3));
});
@ -167,7 +167,7 @@ extension ThumbnailsQueryObject
});
}
QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition> card_cover(
QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition> cardCover(
FilterQuery<Thumbnail> q) {
return QueryBuilder.apply(this, (query) {
return query.object(q, 3);
@ -186,7 +186,7 @@ Thumbnails _$ThumbnailsFromJson(Map<String, dynamic> json) => Thumbnails()
..small = json['small'] == null
? null
: Thumbnail.fromJson(json['small'] as Map<String, dynamic>)
..card_cover = json['card_cover'] == null
..cardCover = json['card_cover'] == null
? null
: Thumbnail.fromJson(json['card_cover'] as Map<String, dynamic>);
@ -194,5 +194,5 @@ Map<String, dynamic> _$ThumbnailsToJson(Thumbnails instance) =>
<String, dynamic>{
'tiny': instance.tiny?.toJson(),
'small': instance.small?.toJson(),
'card_cover': instance.card_cover?.toJson(),
'card_cover': instance.cardCover?.toJson(),
};

View file

@ -1,6 +1,8 @@
import 'package:ambito/src/domain/entity/base_entity.dart';
import 'package:ambito/src/domain/entity/id_value/id_value.dart';
import 'package:ambito/src/domain/entity/id_value_color/id_value_color.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:isar/isar.dart';
import 'package:json_annotation/json_annotation.dart';
@ -150,3 +152,21 @@ class Massnahme extends BaseEntity {
Map<String, dynamic> toJson() => _$MassnahmeToJson(this);
}
extension MassnahmenExtension on Massnahme {
CachedNetworkImage? getThumbnail() {
CachedNetworkImage? image;
if (files != null && files!.isNotEmpty) {
if (files![0].thumbnails?.cardCover?.url != null) {
image = CachedNetworkImage(
imageUrl:files![0].thumbnails!.cardCover!.url!,
placeholder: (context, url) => const CircularProgressIndicator(),
errorWidget: (context, url, error) => const Icon(Icons.error),
);
}
}
return image;
}
}

View file

@ -46,6 +46,7 @@ class BaseApi {
break;
case 'massnahmen':
for (var massnahme in json['results']) {
logger.d(massnahme);
BaseDB.put(Massnahme.fromJson(massnahme));
isar.write((isar) {
isar.massnahmes.put(Massnahme.fromJson(massnahme));

View file

@ -19,7 +19,7 @@ class RestClient {
var headers = {
"Content-Type": contentType,
"Accept": accept,
"Authorization": "Token $AmbitoToken",
"Authorization": "Token $ambitoToken",
};
return headers;
}

View file

@ -6,7 +6,7 @@ import '../../../main.dart';
class BaseDB {
static put(var entity) {
switch (entity.runtimeType) {
switch (entity.runtimeType.toString()) {
case 'Baumarten':
isar.write((isar) {
isar.baumartens.put(entity);

View file

@ -1,5 +1,6 @@
import 'package:ambito/src/domain/entity/massnahme/massnahme.dart';
import 'package:ambito/src/packages/ambito_db/base_db.dart';
import 'package:ambito/src/widgets/form/dropdown_menu.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:expandable_text/expandable_text.dart';
import 'package:flutter/material.dart';
@ -7,84 +8,94 @@ import 'package:flutter/material.dart';
import '../../../main.dart';
class ActionsPage extends StatefulWidget {
const ActionsPage({super.key});
@override
State<StatefulWidget> createState() => ActionsPageState();
}
class ActionsPageState extends State<ActionsPage> {
final GlobalKey<FormFieldState> _keyType = GlobalKey<FormFieldState>();
final TextEditingController _controllerType = TextEditingController();
final GlobalKey<FormFieldState> _keyAreaType = GlobalKey<FormFieldState>();
final TextEditingController _controllerAreaType = TextEditingController();
final GlobalKey<FormFieldState> _keySupport = GlobalKey<FormFieldState>();
final TextEditingController _controllerSupport = TextEditingController();
Map<int, bool> visible = {};
List<String> effort = [];
List<String> effect = [];
List<String> type = [];
Set<String> type = {};
String? filterType;
List<String> areaType = [];
Set<String> areaType = {};
String? filterAreaType;
List<String> region = [];
List<String> support = [];
String? filterSupport;
Set<String> support = {};
@override
void initState() {
super.initState();
effort = [];
effect = [];
type = [];
areaType = [];
type = {};
areaType = {};
region = [];
support = [];
support = {};
}
@override
Widget build(BuildContext context) {
List<Massnahme> massnahmen = BaseDB.getAll('Maßnahme');
Set<String> updatedTypes = {};
Set<String> updatedAreaTypes = {};
Set<String> updatedSupports = {};
List<Widget> actionCards = [];
for (var massnahme in massnahmen) {
//logger.d(massnahme.toJson());
if (massnahme.actionGroup != null &&
!type.contains(massnahme.actionGroup!.value)) {
setState(() {
type.add(massnahme.actionGroup!.value!);
});
if (massnahme.actionGroup != null) {
updatedTypes.add(massnahme.actionGroup!.value!);
}
if (massnahme.factsheetAreaType != null) {
for (var aType in massnahme.factsheetAreaType!) {
if (!areaType.contains(aType.value)) {
setState(() {
areaType.add(aType.value!);
});
}
updatedAreaTypes.add(aType.value!);
}
}
if (massnahme.fundingPrograms != null) {
for (var aType in massnahme.fundingPrograms!) {
updatedSupports.add(aType.value!);
}
}
}
for (var massnahme in massnahmen) {
bool myVisibility = true;
if (filterType != null) {
if (massnahme.actionGroup == null ||
massnahme.actionGroup!.value != filterType) {
myVisibility = false;
}
}
if (filterAreaType != null) {
if (massnahme.factsheetAreaType != null) {
myVisibility = false;
for (var aType in massnahme.factsheetAreaType!) {
if (aType.value == filterAreaType) {
myVisibility = true;
}
}
}
}
setState(() {
type.addAll(updatedTypes);
areaType.addAll(updatedAreaTypes);
support.addAll(updatedSupports);
});
List<Widget> actionCards = massnahmen.map((massnahme) {
bool typeMatches = filterType == null ||
(massnahme.actionGroup != null &&
massnahme.actionGroup!.value == filterType);
bool areaTypeMatches = filterAreaType == null ||
(massnahme.factsheetAreaType
?.any((aType) => aType.value == filterAreaType) ??
false);
bool supportMatches = filterSupport == null ||
(massnahme.fundingPrograms
?.any((aType) => aType.value == filterSupport) ??
false);
// Update visibility based on the matches
setState(() {
visible[massnahme.id] = myVisibility;
visible[massnahme.id] =
typeMatches && areaTypeMatches && supportMatches;
});
actionCards.add(getCard(context, massnahme));
}
logger.d(visible);
//logger.d(areaType);
return getCard(context, massnahme);
}).toList();
return Padding(
padding: const EdgeInsets.only(left: 32, right: 32),
@ -123,98 +134,80 @@ class ActionsPageState extends State<ActionsPage> {
Widget getFilter(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
DropdownMenu(
key: _keyAreaType,
initialSelection: filterAreaType,
leadingIcon: (filterAreaType != null)
? IconButton(
onPressed: () {
_keyAreaType.currentState!.didChange(null);
_keyAreaType.currentState!.reset();
setState(() {
filterAreaType = null;
});
},
icon: const Icon(Icons.delete),
)
: null,
DropdownMenuWidget(
formKey: _keyAreaType,
label: 'Ort der Maßnahme',
controller: _controllerAreaType,
filterValue: filterAreaType,
onClear: () {
setState(() {
filterAreaType = null;
});
_controllerAreaType.clear();
},
onSelected: (String? selection) {
setState(() {
filterAreaType = selection;
});
},
dropdownMenuEntries:
areaType.map<DropdownMenuEntry<String>>((String entry) {
return DropdownMenuEntry<String>(
value: entry,
label: entry,
);
}).toList(),
entries: areaType.toList(),
),
DropdownMenu(
key: _keyType,
leadingIcon: (filterType != null)
? IconButton(
onPressed: () {
setState(() {
filterType = null;
});
_keyType.currentState!.reset();
},
icon: const Icon(Icons.delete),
)
: null,
DropdownMenuWidget(
formKey: _keyType,
label: 'Art der Maßnahme',
controller: _controllerType,
filterValue: filterType,
onClear: () {
setState(() {
filterType = null;
});
_controllerType.clear();
},
onSelected: (String? selection) {
setState(() {
filterType = selection;
});
},
dropdownMenuEntries:
type.map<DropdownMenuEntry<String>>((String entry) {
return DropdownMenuEntry<String>(
value: entry,
label: entry,
);
}).toList(),
entries: type.toList(),
),
DropdownMenuWidget(
formKey: _keySupport,
label: 'Förderprogramm',
controller: _controllerSupport,
filterValue: filterSupport,
onClear: () {
setState(() {
filterSupport = null;
});
_controllerSupport.clear();
},
onSelected: (String? selection) {
setState(() {
filterSupport = selection;
});
},
entries: support.toList(),
),
],
);
}
Widget getCard(BuildContext context, Massnahme massnahme) {
Color background = Colors.white;
switch (massnahme.actionGroup?.value) {
case 'Baulelemente':
background = const Color(0xffFFD269);
break;
case 'Begrünung':
background = const Color(0xff40DD74);
break;
case 'Bewirtschaftung':
background = const Color(0xffBF72ED);
break;
case 'Nisthilfe':
background = const Color(0xffDAE3FD);
break;
case 'Pflanzung':
background = const Color(0xff40D6E9);
break;
case 'Sondermaßnahmen':
background = const Color(0xff689EF1);
break;
}
final Map<String, Color> actionGroupColors = {
'Baulelemente': const Color(0xffFFD269),
'Begrünung': const Color(0xff40DD74),
'Bewirtschaftung': const Color(0xffBF72ED),
'Nisthilfe': const Color(0xffDAE3FD),
'Pflanzung': const Color(0xff40D6E9),
'Sondermaßnahmen': const Color(0xff689EF1),
};
var image;
if (massnahme.files != null && massnahme.files!.isNotEmpty) {
if (massnahme.files![0].thumbnails?.card_cover?.url != null) {
image = CachedNetworkImage(
imageUrl: massnahme.files![0].thumbnails!.card_cover!.url!,
placeholder: (context, url) => const CircularProgressIndicator(),
errorWidget: (context, url, error) => const Icon(Icons.error),
);
}
}
Color background =
actionGroupColors[massnahme.actionGroup?.value] ?? Colors.white;
CachedNetworkImage? image = massnahme.getThumbnail();
return Visibility(
visible: visible[massnahme.id] ?? false,

View file

@ -0,0 +1,85 @@
import 'package:ambito/main.dart';
import 'package:flutter/material.dart';
import '../actions/actions_page.dart';
class StartPage extends StatefulWidget {
const StartPage({super.key});
@override
State<StartPage> createState() => StartPageState();
}
class StartPageState extends State<StartPage> {
String activeLink = '';
@override
void initState() {
activeLink = 'start';
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(height: 50),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
_linkButton('start'),
_linkButton('database'),
_linkButton('designer'),
Image.asset(
'images/logo.png',
scale: 1.3,
),
_linkButton('service'),
_linkButton('network'),
_linkButton('contact'),
],
),
const SizedBox(height: 50),
Expanded(
child: getContent(),
),
],
));
}
Widget getContent() {
if (activeLink == 'database') {
return const ActionsPage();
}
return Text(activeLink);
}
Widget _linkButton(String link) {
double fontSize = 16;
return TextButton(
style: ButtonStyle(
overlayColor:
WidgetStateProperty.resolveWith<Color>((Set<WidgetState> states) {
return Colors.white;
}),
),
onPressed: () {
setState(() {
activeLink = link;
});
},
child: Text(
context.translate('page.start.links.$link.title'),
style: TextStyle(
fontSize: fontSize,
fontWeight: FontWeight.bold,
color: (activeLink == link)
? Colors.grey.shade400
: Colors.grey.shade800,
),
),
);
}
}

View file

@ -0,0 +1 @@

View file

@ -0,0 +1,49 @@
import 'package:flutter/material.dart';
class DropdownMenuWidget extends StatelessWidget {
final Key formKey;
final String label;
final TextEditingController controller;
final String? filterValue;
final VoidCallback onClear;
final void Function(String?) onSelected;
final List<String> entries;
const DropdownMenuWidget({
super.key,
required this.formKey,
required this.label,
required this.controller,
required this.filterValue,
required this.onClear,
required this.onSelected,
required this.entries,
});
@override
Widget build(BuildContext context) {
return DropdownMenu(
key: formKey,
label: Text(label),
controller: controller,
initialSelection: filterValue,
leadingIcon: (filterValue != null)
? IconButton(
onPressed: onClear,
icon: const Icon(Icons.cancel_outlined),
)
: const Icon(
Icons.cancel_outlined,
color: Colors.transparent,
),
onSelected: onSelected,
dropdownMenuEntries:
entries.map<DropdownMenuEntry<String>>((String entry) {
return DropdownMenuEntry<String>(
value: entry,
label: entry,
);
}).toList(),
);
}
}

View file

@ -5,23 +5,18 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
url: "https://pub.dev"
source: hosted
version: "72.0.0"
_macros:
dependency: transitive
description: dart
source: sdk
version: "0.3.2"
version: "67.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
url: "https://pub.dev"
source: hosted
version: "6.7.0"
version: "6.4.1"
args:
dependency: transitive
description:
@ -90,18 +85,18 @@ packages:
dependency: "direct dev"
description:
name: build_runner
sha256: dd09dd4e2b078992f42aac7f1a622f01882a8492fef08486b27ddde929c19f04
sha256: "644dc98a0f179b872f612d3eb627924b578897c629788e858157fa5e704ca0c7"
url: "https://pub.dev"
source: hosted
version: "2.4.12"
version: "2.4.11"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
sha256: e3c79f69a64bdfcd8a776a3c28db4eb6e3fb5356d013ae5eb2e52007706d5dbe
url: "https://pub.dev"
source: hosted
version: "7.3.2"
version: "7.3.1"
built_collection:
dependency: transitive
description:
@ -226,10 +221,10 @@ packages:
dependency: transitive
description:
name: dart_style
sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab"
sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
url: "https://pub.dev"
source: hosted
version: "2.3.7"
version: "2.3.6"
dio:
dependency: transitive
description:
@ -459,7 +454,7 @@ packages:
source: hosted
version: "2.3.2"
http:
dependency: transitive
dependency: "direct main"
description:
name: http
sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
@ -566,18 +561,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
url: "https://pub.dev"
source: hosted
version: "10.0.5"
version: "10.0.4"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.3"
leak_tracker_testing:
dependency: transitive
description:
@ -618,14 +613,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.0"
macros:
dependency: transitive
description:
name: macros
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
url: "https://pub.dev"
source: hosted
version: "0.1.2-main.4"
maps_toolkit:
dependency: "direct main"
description:
@ -646,18 +633,18 @@ packages:
dependency: transitive
description:
name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.dev"
source: hosted
version: "0.11.1"
version: "0.8.0"
meta:
dependency: transitive
description:
name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
url: "https://pub.dev"
source: hosted
version: "1.15.0"
version: "1.12.0"
mgrs_dart:
dependency: transitive
description:
@ -939,10 +926,10 @@ packages:
dependency: transitive
description:
name: sqflite_common
sha256: "4058172e418eb7e7f2058dcb7657d451a8fc264afa0dea4dbd0f304a57131611"
sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4"
url: "https://pub.dev"
source: hosted
version: "2.5.4+3"
version: "2.5.4"
stack_trace:
dependency: transitive
description:
@ -979,10 +966,10 @@ packages:
dependency: transitive
description:
name: synchronized
sha256: "51b08572b9f091f8c3eb4d9d4be253f196ff0075d5ec9b10a884026d5b55d7bc"
sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558"
url: "https://pub.dev"
source: hosted
version: "3.3.0+2"
version: "3.1.0+1"
term_glyph:
dependency: transitive
description:
@ -995,10 +982,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "0.7.0"
timing:
dependency: transitive
description:
@ -1051,10 +1038,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
url: "https://pub.dev"
source: hosted
version: "14.2.5"
version: "14.2.1"
watcher:
dependency: transitive
description:
@ -1128,5 +1115,5 @@ packages:
source: hosted
version: "3.1.2"
sdks:
dart: ">=3.5.0 <4.0.0"
dart: ">=3.4.4 <4.0.0"
flutter: ">=3.22.0"

View file

@ -36,6 +36,7 @@ dependencies:
expandable_text: ^2.3.0
path_provider: ^2.1.4
cached_network_image: ^3.4.1
http: ^1.2.2
dev_dependencies: