saving refactorings

This commit is contained in:
Lucas Oskorep
2023-01-29 00:39:03 -05:00
parent 342e567736
commit f2e7527929
13 changed files with 17328 additions and 249 deletions
+14
View File
@@ -0,0 +1,14 @@
import 'package:tensordex_mobile/db/tables/poke_db.dart';
abstract class PokeStorageService {
Future<void> savePoke(Poke user);
Future<Poke> getPoke(String pokeId);
void addNonExistantPokes(List<Poke> pokes);
void loadDefaultPokes();
void stop();
}
+61
View File
@@ -0,0 +1,61 @@
import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:hive/hive.dart';
import 'package:tensordex_mobile/db/tables/poke_db.dart';
import 'package:tensordex_mobile/db/poke_storage_service.dart';
import 'package:tensordex_mobile/hive.dart';
import '../utils/logger.dart';
/// Implementation of StorageService using Hive Key-Value DB
class PokeStorageServiceImpl implements PokeStorageService {
PokeStorageServiceImpl();
@override
Future savePoke(Poke poke) async {
final pokeBox = await Hive.openBox(pokeBoxName);
await pokeBox.put(poke.id, poke);
}
@override
Future<Poke> getPoke(String id) async {
final pokeBox = await Hive.openBox(pokeBoxName);
final poke = await pokeBox.get(id);
return poke;
}
@override
Future addNonExistantPokes(List<Poke> pokes) async {
final pokeBox = await Hive.openBox(pokeBoxName);
Future.forEach(pokes, (Poke poke) async {
if (!pokeBox.containsKey(poke.id)) {
await pokeBox.put(poke.id, poke);
}
});
}
@override
Future<void> loadDefaultPokes() async {
var allPokeJson = await _loadPokeJson();
List<Poke> pokes = [];
for (var pokeJson in allPokeJson) {
pokes.add(Poke(
id: pokeJson['id'].toString(),
name: pokeJson['name']['english'].toString(),
seen: false,
images: []));
}
await addNonExistantPokes(pokes);
}
Future<List<dynamic>> _loadPokeJson() async {
return await jsonDecode(await rootBundle.loadString('assets/pokemon.json'));
}
@override
void stop() {
Hive.close();
}
}
+29
View File
@@ -0,0 +1,29 @@
import 'package:hive/hive.dart';
part 'poke_db.g.dart';
@HiveType(typeId: 1)
class Poke {
Poke(
{required this.id,
required this.name,
required this.seen,
required this.images});
@HiveField(0)
String id;
@HiveField(1)
String name;
@HiveField(2)
bool seen;
@HiveField(3)
List<String> images;
@override
String toString() {
return '$id: $name | seen?:$seen | images: $images';
}
}
+50
View File
@@ -0,0 +1,50 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'poke_db.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class PokeAdapter extends TypeAdapter<Poke> {
@override
final int typeId = 1;
@override
Poke read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Poke(
id: fields[0] as String,
name: fields[1] as String,
seen: fields[2] as bool,
images: (fields[3] as List).cast<String>(),
);
}
@override
void write(BinaryWriter writer, Poke obj) {
writer
..writeByte(4)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.name)
..writeByte(2)
..write(obj.seen)
..writeByte(3)
..write(obj.images);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is PokeAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
+9
View File
@@ -0,0 +1,9 @@
import 'package:get_it/get_it.dart';
import 'package:tensordex_mobile/db/poke_storage_service.dart';
import 'package:tensordex_mobile/db/poke_storage_service_impl.dart';
final getIt = GetIt.instance;
void setupGetIt() {
getIt.registerSingleton<PokeStorageService>(PokeStorageServiceImpl());
}
+13
View File
@@ -0,0 +1,13 @@
import 'dart:io';
import 'package:hive_flutter/adapters.dart';
import 'db/tables/poke_db.dart';
const pokeBoxName = 'pokes';
Future setupHive() async {
await Hive.initFlutter();
Hive.registerAdapter(PokeAdapter());
await Hive.openBox(pokeBoxName);
}
+11
View File
@@ -1,14 +1,25 @@
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get_it/get_it.dart';
import 'package:tensordex_mobile/db/poke_storage_service.dart';
import 'package:tensordex_mobile/hive.dart';
import 'package:tensordex_mobile/widgets/tensordex_home.dart';
import 'package:tensordex_mobile/utils/logger.dart';
import 'di.dart';
late List<CameraDescription> cameras;
GetIt getIt = GetIt.instance;
Future<void> main() async {
await setupHive();
WidgetsFlutterBinding.ensureInitialized();
cameras = await availableCameras();
setupGetIt();
getIt<PokeStorageService>().loadDefaultPokes();
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
+59 -42
View File
@@ -5,6 +5,7 @@ import 'dart:math';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get_it/get_it.dart';
import 'package:image/image.dart';
import 'package:path_provider/path_provider.dart';
import 'package:tensordex_mobile/tflite/ml_isolate.dart';
@@ -46,6 +47,7 @@ class _PokeFinderState extends State<PokeFinder> with WidgetsBindingObserver {
double _minZoom = 1.0;
double _maxZoom = 1.0;
double _currentZoom = 1.0;
GetIt getIt = GetIt.instance;
late CameraController cameraController;
@@ -118,7 +120,7 @@ class _PokeFinderState extends State<PokeFinder> with WidgetsBindingObserver {
cameraController.initialize().then((_) async {
/// previewSize is size of each image frame captured by controller
/// 352x288 on iOS, 240p (320x240) on Android with ResolutionPreset.low
await cameraController.startImageStream(onLatestImageAvailable);
// await cameraController.startImageStream(onLatestImageAvailable);
_maxZoom = await cameraController.getMaxZoomLevel();
_minZoom = await cameraController.getMinZoomLevel();
setState(() {
@@ -190,47 +192,62 @@ class _PokeFinderState extends State<PokeFinder> with WidgetsBindingObserver {
}
return;
},
child: !_cameraReady? Container(width: 100, height: 100,): Stack(
clipBehavior: Clip.none,
alignment: Alignment.center,
children: [
AspectRatio(
aspectRatio: 1 / cameraController.value.aspectRatio,
child: CameraPreview(cameraController)),
Positioned(
top: -10,
child: TextButton(
onPressed: swapCamera,
child: const Text('Change Camera!')),
),
Positioned(
bottom: -10,
child: Row(
children: [
SizedBox(
width: MediaQuery.of(context).size.width - 100,
child: Slider(
min: pow(_minZoom, 1 / _zoomSliderLogFactor)
.toDouble(),
max: pow(_maxZoom, 1 / _zoomSliderLogFactor)
.toDouble(),
divisions: 100,
value: _currentZoom,
onChanged: (double value) {
logger.i('Zoom updated $value');
_currentZoom = value;
cameraController.setZoomLevel(
pow(_currentZoom, _zoomSliderLogFactor)
.toDouble());
})),
Text(
pow(_currentZoom, _zoomSliderLogFactor)
.toStringAsFixed(2),
style: const TextStyle(color: Colors.lightBlue))
// style: const TextStyle(color: Colors.lightBlue))
],
))
])),
child:
!_cameraReady ?
Container(
width: 100,
height: 100,
)
: Stack(
clipBehavior: Clip.none,
alignment: Alignment.center,
children: [
AspectRatio(
aspectRatio: 1 / cameraController.value.aspectRatio,
child: CameraPreview(cameraController)),
Positioned(
top: -10,
child: TextButton(
onPressed: swapCamera,
child: const Text('Change Camera!')),
),
Positioned(
bottom: -10,
child: Row(
children: [
SizedBox(
width:
MediaQuery.of(context).size.width - 100,
child: Slider(
min: pow(_minZoom,
1 / _zoomSliderLogFactor)
.toDouble(),
max: pow(_maxZoom,
1 / _zoomSliderLogFactor)
.toDouble(),
divisions: 100,
value: _currentZoom,
onChanged: (double value) {
var newValue = pow(
_currentZoom,
_zoomSliderLogFactor)
.toDouble();
logger.i('Zoom updated $value $newValue');
_currentZoom = value;
cameraController.setZoomLevel(pow(
_currentZoom,
_zoomSliderLogFactor)
.toDouble());
})),
Text(
pow(_currentZoom, _zoomSliderLogFactor)
.toStringAsFixed(2),
style: const TextStyle(
color: Colors.lightBlue))
// style: const TextStyle(color: Colors.lightBlue))
],
))
])),
TextButton(
onPressed: saveMLImage, child: const Text('Save Model Image')),
],
+1 -29
View File
@@ -76,7 +76,7 @@ class _TensordexHomeState extends State<TensordexHome> {
children: [
PokeFinder(
resultsCallback: resultsCallback, statsCallback: statsCallback),
Results(results, stats),
// Results(results, stats),
],
),
const Text(
@@ -96,34 +96,6 @@ class _TensordexHomeState extends State<TensordexHome> {
appBar: AppBar(
title: Text(widget.title),
),
// drawer: Drawer(
// child: ListView(
// // Important: Remove any padding from the ListView.
// padding: EdgeInsets.zero,
// children: [
// const DrawerHeader(
// decoration: BoxDecoration(
// color: Colors.blue,
// ),
// child: Text('Drawer Header'),
// ),
// ListTile(
// title: const Text('Item 1'),
// onTap: () {
// // Update the state of the app.
// // ...
// },
// ),
// ListTile(
// title: const Text('Item 2'),
// onTap: () {
// // Update the state of the app.
// // ...
// },
// ),
// ],
// ),
// ),
body: Center(
child: _widgetOptions.elementAt(_selectedNavBarIndex),
),