WIP: remplace file storage with Hive boxes storage
This commit is contained in:
parent
5296ab107b
commit
0c55cdc141
|
@ -1,19 +1,20 @@
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:gecko/models/myWallets.dart';
|
import 'package:gecko/models/walletData.dart';
|
||||||
|
import 'package:hive/hive.dart';
|
||||||
import 'package:logger/logger.dart';
|
import 'package:logger/logger.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
// Files paths
|
// Files paths
|
||||||
Directory appPath;
|
Directory appPath;
|
||||||
Directory walletsDirectory;
|
|
||||||
File defaultWalletFile;
|
|
||||||
File currentChestFile;
|
|
||||||
|
|
||||||
WalletData defaultWallet;
|
WalletData defaultWallet;
|
||||||
String appVersion;
|
String appVersion;
|
||||||
SharedPreferences prefs;
|
SharedPreferences prefs;
|
||||||
String endPointGVA;
|
String endPointGVA;
|
||||||
int ramSys;
|
int ramSys;
|
||||||
|
Box<WalletData> walletBox;
|
||||||
|
Box chestBox;
|
||||||
|
Box configBox;
|
||||||
|
|
||||||
// String cesiumPod = "https://g1.data.le-sou.org";
|
// String cesiumPod = "https://g1.data.le-sou.org";
|
||||||
String cesiumPod = "https://g1.data.e-is.pro";
|
String cesiumPod = "https://g1.data.e-is.pro";
|
||||||
|
|
|
@ -22,13 +22,15 @@ import 'package:gecko/models/generateWallets.dart';
|
||||||
import 'package:gecko/models/history.dart';
|
import 'package:gecko/models/history.dart';
|
||||||
import 'package:gecko/models/home.dart';
|
import 'package:gecko/models/home.dart';
|
||||||
import 'package:gecko/models/myWallets.dart';
|
import 'package:gecko/models/myWallets.dart';
|
||||||
|
import 'package:gecko/models/walletData.dart';
|
||||||
import 'package:gecko/models/walletOptions.dart';
|
import 'package:gecko/models/walletOptions.dart';
|
||||||
import 'package:gecko/screens/home.dart';
|
import 'package:gecko/screens/home.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gecko/screens/myWallets/walletsHome.dart';
|
import 'package:gecko/screens/myWallets/walletsHome.dart';
|
||||||
import 'package:graphql_flutter/graphql_flutter.dart';
|
import 'package:graphql_flutter/graphql_flutter.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:responsive_framework/responsive_framework.dart';
|
import 'package:responsive_framework/responsive_framework.dart';
|
||||||
|
@ -41,16 +43,18 @@ Future<void> main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
HomeProvider _homeProvider = HomeProvider();
|
HomeProvider _homeProvider = HomeProvider();
|
||||||
MyWalletsProvider _walletsProvider = MyWalletsProvider();
|
appPath = await getApplicationDocumentsDirectory();
|
||||||
await _homeProvider.getAppPath();
|
|
||||||
await _homeProvider.createDefaultAvatar();
|
await _homeProvider.createDefaultAvatar();
|
||||||
await _walletsProvider.initWalletFolder();
|
|
||||||
// _walletsProvider.getDefaultWallet();
|
// _walletsProvider.getDefaultWallet();
|
||||||
appVersion = await _homeProvider.getAppVersion();
|
appVersion = await _homeProvider.getAppVersion();
|
||||||
prefs = await SharedPreferences.getInstance();
|
prefs = await SharedPreferences.getInstance();
|
||||||
|
|
||||||
Hive.init(appPath.path);
|
// Configure Hive and open boxes
|
||||||
await Hive.openBox("walletBox");
|
await Hive.initFlutter(appPath.path);
|
||||||
|
Hive.registerAdapter(WalletDataAdapter());
|
||||||
|
walletBox = await Hive.openBox<WalletData>("walletBox");
|
||||||
|
chestBox = await Hive.openBox("chestBox");
|
||||||
|
configBox = await Hive.openBox("configBox");
|
||||||
|
|
||||||
// final HiveStore _store =
|
// final HiveStore _store =
|
||||||
// await HiveStore.open(path: '${appPath.path}/gqlCache');
|
// await HiveStore.open(path: '${appPath.path}/gqlCache');
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import 'dart:io';
|
|
||||||
import 'package:dubp/dubp.dart';
|
import 'package:dubp/dubp.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -13,9 +12,7 @@ class ChangePinProvider with ChangeNotifier {
|
||||||
|
|
||||||
Future<NewWallet> changePin(_name, _oldPin) async {
|
Future<NewWallet> changePin(_name, _oldPin) async {
|
||||||
try {
|
try {
|
||||||
final _walletFile = Directory('${walletsDirectory.path}/$_name');
|
final _dewif = chestBox.get(0);
|
||||||
final _dewif =
|
|
||||||
File(_walletFile.path + '/wallet.dewif').readAsLinesSync()[0];
|
|
||||||
|
|
||||||
NewWallet newWalletFile = await DubpRust.changeDewifPin(
|
NewWallet newWalletFile = await DubpRust.changeDewifPin(
|
||||||
dewif: _dewif,
|
dewif: _dewif,
|
||||||
|
@ -32,12 +29,9 @@ class ChangePinProvider with ChangeNotifier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future storeWallet(context, _name, _newWalletFile) async {
|
Future storeWallet(context, _name, NewWallet _newWalletFile) async {
|
||||||
final Directory walletNameDirectory =
|
chestBox.put(0, _newWalletFile.dewif);
|
||||||
Directory('${walletsDirectory.path}/$_name');
|
|
||||||
final walletFile = File('${walletNameDirectory.path}/wallet.dewif');
|
|
||||||
|
|
||||||
walletFile.writeAsString('${_newWalletFile.dewif}');
|
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
return _name;
|
return _name;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import 'dart:io';
|
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
import 'package:dubp/dubp.dart';
|
import 'package:dubp/dubp.dart';
|
||||||
|
@ -6,6 +5,7 @@ import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
|
import 'package:gecko/models/walletData.dart';
|
||||||
import 'package:pdf/pdf.dart';
|
import 'package:pdf/pdf.dart';
|
||||||
import 'package:pdf/widgets.dart' as pw;
|
import 'package:pdf/widgets.dart' as pw;
|
||||||
import 'package:printing/printing.dart';
|
import 'package:printing/printing.dart';
|
||||||
|
@ -38,40 +38,14 @@ class GenerateWalletsProvider with ChangeNotifier {
|
||||||
bool canImport = false;
|
bool canImport = false;
|
||||||
bool isPinChanged = false;
|
bool isPinChanged = false;
|
||||||
|
|
||||||
Future storeHDWChest(
|
void storeHDWChest(
|
||||||
NewWallet _wallet, String _name, BuildContext context) async {
|
NewWallet _wallet, String _name, BuildContext context) async {
|
||||||
// Directory walletDirectory;
|
WalletData myWallet =
|
||||||
|
WalletData(chest: 0, number: 0, name: _name, derivation: 3);
|
||||||
final Directory hdDirectory = Directory('${walletsDirectory.path}/0');
|
walletBox.add(myWallet);
|
||||||
await hdDirectory.create();
|
chestBox.put(0, _wallet.dewif);
|
||||||
|
configBox.put('currentChest', 0);
|
||||||
final configFile = File('${hdDirectory.path}/list.conf');
|
// walletBox.get(1)
|
||||||
File _currentChestFile = File('${walletsDirectory.path}/currentChest.conf');
|
|
||||||
|
|
||||||
final dewifFile = File('${hdDirectory.path}/wallet.dewif');
|
|
||||||
|
|
||||||
// List<String> _lastConfig = [];
|
|
||||||
// _lastConfig = await masterConfigFile.readAsLines();
|
|
||||||
// final int _lastDerivation = int.parse(_lastConfig.last.split(':')[2]);
|
|
||||||
// final int _derivationNbr = _lastDerivation + 3;
|
|
||||||
|
|
||||||
final int _derivationNbr = 3;
|
|
||||||
List _pubkeysTmp = await DubpRust.getBip32DewifAccountsPublicKeys(
|
|
||||||
dewif: _wallet.dewif,
|
|
||||||
secretCode: _wallet.pin,
|
|
||||||
accountsIndex: [_derivationNbr]);
|
|
||||||
String _pubkey = _pubkeysTmp[0];
|
|
||||||
|
|
||||||
await configFile.writeAsString('0:0:$_name:$_derivationNbr:$_pubkey');
|
|
||||||
await dewifFile.writeAsString(_wallet.dewif);
|
|
||||||
bool isCurrentChestExist = _currentChestFile.existsSync();
|
|
||||||
if (isCurrentChestExist) {
|
|
||||||
await _currentChestFile.delete();
|
|
||||||
}
|
|
||||||
await _currentChestFile.create();
|
|
||||||
await _currentChestFile.writeAsString('0');
|
|
||||||
|
|
||||||
return _name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkAskedWord(String inputWord, String _mnemo) {
|
void checkAskedWord(String inputWord, String _mnemo) {
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:dubp/dubp.dart';
|
import 'package:dubp/dubp.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -52,10 +50,7 @@ class HistoryProvider with ChangeNotifier {
|
||||||
|
|
||||||
Future<String> pay(BuildContext context, String pinCode) async {
|
Future<String> pay(BuildContext context, String pinCode) async {
|
||||||
// MyWalletsProvider _myWalletProvider = MyWalletsProvider();
|
// MyWalletsProvider _myWalletProvider = MyWalletsProvider();
|
||||||
List dewifList = await File(
|
String dewif = chestBox.get(0);
|
||||||
walletsDirectory.path + '/${defaultWallet.chest}/wallet.dewif')
|
|
||||||
.readAsLines();
|
|
||||||
String dewif = dewifList[0];
|
|
||||||
try {
|
try {
|
||||||
await DubpRust.simplePaymentFromTransparentAccount(
|
await DubpRust.simplePaymentFromTransparentAccount(
|
||||||
accountIndex: defaultWallet.derivation,
|
accountIndex: defaultWallet.derivation,
|
||||||
|
|
|
@ -11,7 +11,6 @@ import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/screens/history.dart';
|
import 'package:gecko/screens/history.dart';
|
||||||
import 'package:gecko/screens/myWallets/walletsHome.dart';
|
import 'package:gecko/screens/myWallets/walletsHome.dart';
|
||||||
import 'package:package_info/package_info.dart';
|
import 'package:package_info/package_info.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
|
||||||
|
|
||||||
class HomeProvider with ChangeNotifier {
|
class HomeProvider with ChangeNotifier {
|
||||||
int _currentIndex = 0;
|
int _currentIndex = 0;
|
||||||
|
@ -100,17 +99,6 @@ class HomeProvider with ChangeNotifier {
|
||||||
return _endpoint;
|
return _endpoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future getAppPath() async {
|
|
||||||
appPath = await getApplicationDocumentsDirectory();
|
|
||||||
walletsDirectory = Directory('${appPath.path}/wallets');
|
|
||||||
|
|
||||||
bool isWalletFolderExist = await walletsDirectory.exists();
|
|
||||||
|
|
||||||
if (!isWalletFolderExist) {
|
|
||||||
await Directory(walletsDirectory.path).create();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future createDefaultAvatar() async {
|
Future createDefaultAvatar() async {
|
||||||
File defaultAvatar = File(appPath.path + '/default_avatar.png');
|
File defaultAvatar = File(appPath.path + '/default_avatar.png');
|
||||||
final bool isAvatarExist = await defaultAvatar.exists();
|
final bool isAvatarExist = await defaultAvatar.exists();
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import 'dart:io';
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
|
import 'package:gecko/models/walletData.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class MyWalletsProvider with ChangeNotifier {
|
class MyWalletsProvider with ChangeNotifier {
|
||||||
|
@ -10,42 +10,12 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
String pinCode;
|
String pinCode;
|
||||||
int pinLenght;
|
int pinLenght;
|
||||||
|
|
||||||
Future initWalletFolder() async {
|
|
||||||
// getDefaultWallet();
|
|
||||||
|
|
||||||
final bool isWalletFolderExist = await walletsDirectory.exists();
|
|
||||||
if (!isWalletFolderExist) {
|
|
||||||
await Directory(walletsDirectory.path).create();
|
|
||||||
}
|
|
||||||
|
|
||||||
File _currentChestFile = File('${walletsDirectory.path}/currentChest.conf');
|
|
||||||
|
|
||||||
await _currentChestFile.create();
|
|
||||||
await _currentChestFile.writeAsString('0');
|
|
||||||
|
|
||||||
final bool isChestsExist =
|
|
||||||
await Directory('${walletsDirectory.path}/0').exists();
|
|
||||||
if (!isChestsExist) {
|
|
||||||
await Directory('${walletsDirectory.path}/0').create();
|
|
||||||
await Directory('${walletsDirectory.path}/1').create();
|
|
||||||
await File('${walletsDirectory.path}/0/list.conf').create();
|
|
||||||
await File('${walletsDirectory.path}/0/order.conf').create();
|
|
||||||
await File('${walletsDirectory.path}/1/list.conf').create();
|
|
||||||
await File('${walletsDirectory.path}/1/order.conf').create();
|
|
||||||
// getDefaultWallet();
|
|
||||||
}
|
|
||||||
await getDefaultWalletAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
int getCurrentChest() {
|
int getCurrentChest() {
|
||||||
File _currentChestFile = File('${walletsDirectory.path}/currentChest.conf');
|
if (configBox.get('currentChest') == null) {
|
||||||
|
configBox.put('currentChest', 0);
|
||||||
bool isCurrentChestExist = _currentChestFile.existsSync();
|
|
||||||
if (!isCurrentChestExist) {
|
|
||||||
_currentChestFile.createSync();
|
|
||||||
_currentChestFile.writeAsString('0');
|
|
||||||
}
|
}
|
||||||
return int.parse(_currentChestFile.readAsStringSync());
|
|
||||||
|
return configBox.get('currentChest');
|
||||||
}
|
}
|
||||||
|
|
||||||
bool checkIfWalletExist() {
|
bool checkIfWalletExist() {
|
||||||
|
@ -63,89 +33,50 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List readAllWallets(int _chest) {
|
List<WalletData> readAllWallets(int _chest) {
|
||||||
// log.d(walletsDirectory.path);
|
walletBox.toMap().forEach((key, value) {
|
||||||
|
if (value.chest == _chest) {
|
||||||
listWallets = [];
|
listWallets.add(value);
|
||||||
|
}
|
||||||
File _walletConfig = File('${walletsDirectory.path}/$_chest/list.conf');
|
|
||||||
_walletConfig.readAsLinesSync().forEach((element) {
|
|
||||||
listWallets.add(WalletData(element));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
log.i(listWallets.toString());
|
|
||||||
return listWallets;
|
return listWallets;
|
||||||
}
|
}
|
||||||
|
|
||||||
WalletData getWalletData(String _id) {
|
WalletData getWalletData(List<int> _id) {
|
||||||
// log.d(_id);
|
if (_id.isEmpty) return WalletData();
|
||||||
if (_id == '') return WalletData('');
|
int _chest = _id[0];
|
||||||
int chest = int.parse(_id.split(':')[0]);
|
int _nbr = _id[1];
|
||||||
final _walletConfig = File('${walletsDirectory.path}/$chest/list.conf');
|
|
||||||
|
|
||||||
return WalletData(_walletConfig
|
walletBox.toMap().forEach((key, value) {
|
||||||
.readAsLinesSync()
|
if (value.chest == _chest && value.number == _nbr) {
|
||||||
.firstWhere((element) => element.startsWith(_id)));
|
return value;
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Future<WalletData> getWalletDataAsync(String _id) async {
|
return WalletData();
|
||||||
// log.d(_id);
|
|
||||||
if (_id == '') return WalletData('');
|
|
||||||
int chest = int.parse(_id.split(':')[0]);
|
|
||||||
final _walletConfig = File('${walletsDirectory.path}/$chest/list.conf');
|
|
||||||
|
|
||||||
List configLines = await _walletConfig.readAsLines();
|
|
||||||
//log.d(configLines);
|
|
||||||
|
|
||||||
if (configLines.isEmpty) {
|
|
||||||
return WalletData('');
|
|
||||||
}
|
|
||||||
|
|
||||||
return WalletData(
|
|
||||||
configLines.firstWhere((element) => element.startsWith(_id)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void getDefaultWallet() {
|
void getDefaultWallet() {
|
||||||
defaultWalletFile = File('${appPath.path}/defaultWallet');
|
if (configBox.get('defaultWallet') == null) {
|
||||||
|
configBox.put('defaultWallet', [0, 0]);
|
||||||
if (!defaultWalletFile.existsSync()) {
|
|
||||||
File(defaultWalletFile.path).createSync();
|
|
||||||
defaultWalletFile.writeAsStringSync("0:0");
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultWallet = getWalletData(defaultWalletFile.readAsStringSync());
|
|
||||||
}
|
|
||||||
|
|
||||||
Future getDefaultWalletAsync() async {
|
|
||||||
defaultWalletFile = File('${appPath.path}/defaultWallet');
|
|
||||||
|
|
||||||
if (!await defaultWalletFile.exists()) {
|
|
||||||
await File(defaultWalletFile.path).create();
|
|
||||||
await defaultWalletFile.writeAsString("0:0");
|
|
||||||
} else {
|
|
||||||
defaultWallet =
|
|
||||||
await getWalletDataAsync(await defaultWalletFile.readAsString());
|
|
||||||
}
|
}
|
||||||
|
defaultWallet = configBox.get('defaultWallet');
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<int> deleteAllWallet(context) async {
|
Future<int> deleteAllWallet(context) async {
|
||||||
MyWalletsProvider _myWalletProvider =
|
MyWalletsProvider _myWalletProvider =
|
||||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||||
try {
|
try {
|
||||||
log.w('DELETE THAT ?: $walletsDirectory');
|
log.w('DELETE ALL WALLETS ?');
|
||||||
|
|
||||||
final bool _answer = await _confirmDeletingAllWallets(context);
|
final bool _answer = await _confirmDeletingAllWallets(context);
|
||||||
if (_answer) {
|
if (_answer) {
|
||||||
await walletsDirectory.delete(recursive: true);
|
await walletBox.clear();
|
||||||
await defaultWalletFile.delete();
|
await chestBox.clear();
|
||||||
await walletsDirectory.create();
|
|
||||||
await initWalletFolder();
|
|
||||||
// await Future.delayed(Duration(milliseconds: 500));
|
|
||||||
// scheduleMicrotask(() {
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
rebuildWidget();
|
rebuildWidget();
|
||||||
_myWalletProvider.rebuildWidget();
|
_myWalletProvider.rebuildWidget();
|
||||||
// });
|
|
||||||
|
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
}
|
}
|
||||||
|
@ -187,27 +118,26 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
Future<void> generateNewDerivation(context, String _name) async {
|
Future<void> generateNewDerivation(context, String _name) async {
|
||||||
int _newDerivationNbr;
|
int _newDerivationNbr;
|
||||||
int _newWalletNbr;
|
int _newWalletNbr;
|
||||||
final _walletConfig = File('${walletsDirectory.path}/0/list.conf');
|
int _chest = 0;
|
||||||
|
List<WalletData> _walletConfig = readAllWallets(_chest);
|
||||||
|
|
||||||
if (await _walletConfig.readAsString() == '') {
|
if (_walletConfig.isEmpty) {
|
||||||
_newDerivationNbr = 3;
|
_newDerivationNbr = 3;
|
||||||
_newWalletNbr = 0;
|
_newWalletNbr = 0;
|
||||||
} else {
|
} else {
|
||||||
String _lastWallet =
|
_newDerivationNbr = _walletConfig.last.derivation + 3;
|
||||||
await _walletConfig.readAsLines().then((value) => value.last);
|
_newWalletNbr = _walletConfig.last.number + 1;
|
||||||
int _lastDerivation = int.parse(_lastWallet.split(':')[3]);
|
|
||||||
_newDerivationNbr = _lastDerivation + 3;
|
|
||||||
|
|
||||||
int _lastWalletNbr = int.parse(_lastWallet.split(':')[1]);
|
|
||||||
_newWalletNbr = _lastWalletNbr + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await _walletConfig.writeAsString(
|
WalletData newWallet = WalletData(
|
||||||
'\n0:$_newWalletNbr:$_name:$_newDerivationNbr',
|
chest: _chest,
|
||||||
mode: FileMode.append);
|
number: _newWalletNbr,
|
||||||
|
name: _name,
|
||||||
|
derivation: _newDerivationNbr);
|
||||||
|
|
||||||
|
await walletBox.add(newWallet);
|
||||||
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,44 +145,3 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// wallet data contains elements identifying wallet
|
|
||||||
class WalletData {
|
|
||||||
int chest;
|
|
||||||
int number;
|
|
||||||
String name;
|
|
||||||
int derivation;
|
|
||||||
|
|
||||||
// constructor from ':'-separated string
|
|
||||||
WalletData(String element) {
|
|
||||||
if (element != '') {
|
|
||||||
List parts = element.split(':');
|
|
||||||
|
|
||||||
this.chest = int.parse(parts[0]);
|
|
||||||
this.number = int.parse(parts[1]);
|
|
||||||
this.name = parts[2];
|
|
||||||
this.derivation = int.parse(parts[3]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// default wallet
|
|
||||||
static WalletData defaultWallet() {
|
|
||||||
return WalletData("0:0:default:3");
|
|
||||||
}
|
|
||||||
|
|
||||||
// representation of WalletData when debugging
|
|
||||||
@override
|
|
||||||
String toString() {
|
|
||||||
return this.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
// creates the ':'-separated string from the WalletData
|
|
||||||
String inLine() {
|
|
||||||
return "${this.chest}:${this.number}:${this.name}:${this.derivation}";
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns only the id part of the ':'-separated string
|
|
||||||
String id() {
|
|
||||||
return "${this.chest}:${this.number}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
|
|
||||||
|
part 'walletData.g.dart';
|
||||||
|
|
||||||
|
@HiveType(typeId: 0)
|
||||||
|
class WalletData extends HiveObject {
|
||||||
|
@HiveField(0)
|
||||||
|
int chest;
|
||||||
|
|
||||||
|
@HiveField(1)
|
||||||
|
int number;
|
||||||
|
|
||||||
|
@HiveField(2)
|
||||||
|
String name;
|
||||||
|
|
||||||
|
@HiveField(3)
|
||||||
|
int derivation;
|
||||||
|
|
||||||
|
WalletData({this.chest, this.number, this.name, this.derivation});
|
||||||
|
|
||||||
|
// representation of WalletData when debugging
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// creates the ':'-separated string from the WalletData
|
||||||
|
String inLine() {
|
||||||
|
return "${this.chest}:${this.number}:${this.name}:${this.derivation}";
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns only the id part of the ':'-separated string
|
||||||
|
List id() {
|
||||||
|
return [this.chest, this.number];
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'walletData.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// TypeAdapterGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
class WalletDataAdapter extends TypeAdapter<WalletData> {
|
||||||
|
@override
|
||||||
|
final int typeId = 0;
|
||||||
|
|
||||||
|
@override
|
||||||
|
WalletData read(BinaryReader reader) {
|
||||||
|
final numOfFields = reader.readByte();
|
||||||
|
final fields = <int, dynamic>{
|
||||||
|
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
||||||
|
};
|
||||||
|
return WalletData(
|
||||||
|
chest: fields[0] as int,
|
||||||
|
number: fields[1] as int,
|
||||||
|
name: fields[2] as String,
|
||||||
|
derivation: fields[3] as int,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void write(BinaryWriter writer, WalletData obj) {
|
||||||
|
writer
|
||||||
|
..writeByte(4)
|
||||||
|
..writeByte(0)
|
||||||
|
..write(obj.chest)
|
||||||
|
..writeByte(1)
|
||||||
|
..write(obj.number)
|
||||||
|
..writeByte(2)
|
||||||
|
..write(obj.name)
|
||||||
|
..writeByte(3)
|
||||||
|
..write(obj.derivation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => typeId.hashCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
other is WalletDataAdapter &&
|
||||||
|
runtimeType == other.runtimeType &&
|
||||||
|
typeId == other.typeId;
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/myWallets.dart';
|
import 'package:gecko/models/myWallets.dart';
|
||||||
|
import 'package:gecko/models/walletData.dart';
|
||||||
import 'package:image_picker/image_picker.dart';
|
import 'package:image_picker/image_picker.dart';
|
||||||
import 'package:truncate/truncate.dart';
|
import 'package:truncate/truncate.dart';
|
||||||
import 'package:qrscan/qrscan.dart' as scanner;
|
import 'package:qrscan/qrscan.dart' as scanner;
|
||||||
|
@ -23,7 +24,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
bool isBalanceBlur = true;
|
bool isBalanceBlur = true;
|
||||||
FocusNode walletNameFocus = FocusNode();
|
FocusNode walletNameFocus = FocusNode();
|
||||||
TextEditingController nameController = TextEditingController();
|
TextEditingController nameController = TextEditingController();
|
||||||
String walletID;
|
List<int> walletID;
|
||||||
bool isDefaultWallet;
|
bool isDefaultWallet;
|
||||||
|
|
||||||
Future<NewWallet> get badWallet => null;
|
Future<NewWallet> get badWallet => null;
|
||||||
|
@ -75,14 +76,8 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
context, WalletData _wallet, String _pin, int _pinLenght) async {
|
context, WalletData _wallet, String _pin, int _pinLenght) async {
|
||||||
isWalletUnlock = false;
|
isWalletUnlock = false;
|
||||||
try {
|
try {
|
||||||
File _walletFile = File('${walletsDirectory.path}/0/wallet.dewif');
|
String _localDewif = chestBox.get(0);
|
||||||
String _localDewif = await _walletFile.readAsString();
|
|
||||||
String _localPubkey;
|
String _localPubkey;
|
||||||
// log.d("$_localDewif $_pin $_pinLenght ${_wallet.derivation}");
|
|
||||||
|
|
||||||
// String mnemo = await DubpRust.getBip32DewifMnemonic(
|
|
||||||
// dewif: _localDewif, secretCode: _pin);
|
|
||||||
// log.d(mnemo.toString());
|
|
||||||
|
|
||||||
if ((_localPubkey = await _getPubkeyFromDewif(
|
if ((_localPubkey = await _getPubkeyFromDewif(
|
||||||
_localDewif, _pin, _pinLenght, _wallet.derivation)) !=
|
_localDewif, _pin, _pinLenght, _wallet.derivation)) !=
|
||||||
|
@ -119,8 +114,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
int getPinLenght(_walletNbr) {
|
int getPinLenght(_walletNbr) {
|
||||||
String _localDewif;
|
String _localDewif;
|
||||||
if (_walletNbr is int) {
|
if (_walletNbr is int) {
|
||||||
File _walletFile = File('${walletsDirectory.path}/0/wallet.dewif');
|
_localDewif = chestBox.get(0);
|
||||||
_localDewif = _walletFile.readAsStringSync();
|
|
||||||
} else {
|
} else {
|
||||||
_localDewif = _walletNbr;
|
_localDewif = _walletNbr;
|
||||||
}
|
}
|
||||||
|
@ -131,24 +125,13 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
return _pinLenght;
|
return _pinLenght;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future _renameWallet(_walletID, _newName) async {
|
Future _renameWallet(List<int> _walletID, _newName) async {
|
||||||
final _walletConfig = File('${walletsDirectory.path}/0/list.conf');
|
MyWalletsProvider myWalletClass = MyWalletsProvider();
|
||||||
|
|
||||||
String newConfig =
|
WalletData _walletTarget = myWalletClass.getWalletData(_walletID);
|
||||||
await _walletConfig.readAsLines().then((List<String> lines) {
|
_walletTarget.name = _newName;
|
||||||
for (String wLine in lines) {
|
await walletBox.putAt(_walletTarget.key, _walletTarget);
|
||||||
String wID = "${wLine.split(':')[0]}:${wLine.split(':')[1]}";
|
|
||||||
String deri = wLine.split(':')[3];
|
|
||||||
if (wID == _walletID) {
|
|
||||||
lines.remove(wLine);
|
|
||||||
lines.add('$_walletID:$_newName:$deri');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lines.join('\n');
|
|
||||||
});
|
|
||||||
|
|
||||||
await _walletConfig.delete();
|
|
||||||
await _walletConfig.writeAsString(newConfig);
|
|
||||||
_newWalletName.text = '';
|
_newWalletName.text = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,7 +176,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> editWalletName(_wID) async {
|
Future<bool> editWalletName(List<int> _wID) async {
|
||||||
bool nameState;
|
bool nameState;
|
||||||
if (isEditing) {
|
if (isEditing) {
|
||||||
if (!nameController.text.contains(':') &&
|
if (!nameController.text.contains(':') &&
|
||||||
|
@ -213,27 +196,12 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
return nameState;
|
return nameState;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<int> deleteWallet(context, wallet) async {
|
Future<int> deleteWallet(context, WalletData wallet) async {
|
||||||
final bool _answer = await _confirmDeletingWallet(context, wallet.name);
|
final bool _answer = await _confirmDeletingWallet(context, wallet.name);
|
||||||
|
|
||||||
if (_answer) {
|
if (_answer) {
|
||||||
final _walletConfig = File('${walletsDirectory.path}/0/list.conf');
|
walletBox.delete(wallet.key);
|
||||||
|
|
||||||
if (wallet.derivation != -1) {
|
|
||||||
String newConfig =
|
|
||||||
await _walletConfig.readAsLines().then((List<String> lines) {
|
|
||||||
lines.removeWhere((element) => element.contains(wallet.inLine()));
|
|
||||||
|
|
||||||
return lines.join('\n');
|
|
||||||
});
|
|
||||||
|
|
||||||
await _walletConfig.delete();
|
|
||||||
await _walletConfig.writeAsString(newConfig);
|
|
||||||
} else {
|
|
||||||
final _walletFile =
|
|
||||||
Directory('${walletsDirectory.path}/${wallet.number}');
|
|
||||||
await _walletFile.delete(recursive: true);
|
|
||||||
}
|
|
||||||
Navigator.popUntil(
|
Navigator.popUntil(
|
||||||
context,
|
context,
|
||||||
ModalRoute.withName('/mywallets'),
|
ModalRoute.withName('/mywallets'),
|
||||||
|
@ -278,9 +246,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
|
|
||||||
Future<NewWallet> changePin(_name, _oldPin) async {
|
Future<NewWallet> changePin(_name, _oldPin) async {
|
||||||
try {
|
try {
|
||||||
final _walletFile = Directory('${walletsDirectory.path}/$_name');
|
final _dewif = chestBox.get(0);
|
||||||
final _dewif =
|
|
||||||
File(_walletFile.path + '/wallet.dewif').readAsLinesSync()[0];
|
|
||||||
|
|
||||||
NewWallet newWalletFile = await DubpRust.changeDewifPin(
|
NewWallet newWalletFile = await DubpRust.changeDewifPin(
|
||||||
dewif: _dewif,
|
dewif: _dewif,
|
||||||
|
@ -297,16 +263,6 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future storeWallet(context, _name, _newWalletFile) async {
|
|
||||||
final Directory walletNameDirectory =
|
|
||||||
Directory('${walletsDirectory.path}/$_name');
|
|
||||||
final walletFile = File('${walletNameDirectory.path}/wallet.dewif');
|
|
||||||
|
|
||||||
walletFile.writeAsString('${_newWalletFile.dewif}');
|
|
||||||
Navigator.pop(context);
|
|
||||||
return _name;
|
|
||||||
}
|
|
||||||
|
|
||||||
snackCopyKey(context) {
|
snackCopyKey(context) {
|
||||||
final snackBar = SnackBar(
|
final snackBar = SnackBar(
|
||||||
content:
|
content:
|
||||||
|
@ -341,13 +297,6 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
return await scanner.generateBarCode(_pubkey);
|
return await scanner.generateBarCode(_pubkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
void defAsDefaultWallet(String _id) {
|
|
||||||
defaultWalletFile.deleteSync();
|
|
||||||
defaultWalletFile.createSync();
|
|
||||||
defaultWalletFile.writeAsStringSync(_id);
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future changeAvatar() async {
|
Future changeAvatar() async {
|
||||||
File _image;
|
File _image;
|
||||||
final picker = ImagePicker();
|
final picker = ImagePicker();
|
||||||
|
|
|
@ -22,6 +22,12 @@ class HomeScreen extends StatelessWidget {
|
||||||
Provider.of<MyWalletsProvider>(context);
|
Provider.of<MyWalletsProvider>(context);
|
||||||
final bool isWalletsExists = _myWalletProvider.checkIfWalletExist();
|
final bool isWalletsExists = _myWalletProvider.checkIfWalletExist();
|
||||||
|
|
||||||
|
// walletBox.toMap().forEach((key, value) {
|
||||||
|
// if (value.chest == 0) {
|
||||||
|
// print('$key: ${value.derivation}');
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
isTall = false;
|
isTall = false;
|
||||||
ratio = 1;
|
ratio = 1;
|
||||||
if (MediaQuery.of(context).size.height >= 930) {
|
if (MediaQuery.of(context).size.height >= 930) {
|
||||||
|
|
|
@ -134,8 +134,8 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
|
||||||
onPressed: (_generateWalletProvider
|
onPressed: (_generateWalletProvider
|
||||||
.isAskedWordValid &&
|
.isAskedWordValid &&
|
||||||
this.walletName.text != '')
|
this.walletName.text != '')
|
||||||
? () async {
|
? () {
|
||||||
await _generateWalletProvider.storeHDWChest(
|
_generateWalletProvider.storeHDWChest(
|
||||||
generatedWallet,
|
generatedWallet,
|
||||||
walletName.text,
|
walletName.text,
|
||||||
context);
|
context);
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:dubp/dubp.dart';
|
import 'package:dubp/dubp.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:gecko/models/history.dart';
|
import 'package:gecko/models/history.dart';
|
||||||
import 'package:gecko/models/myWallets.dart';
|
import 'package:gecko/models/myWallets.dart';
|
||||||
|
import 'package:gecko/models/walletData.dart';
|
||||||
import 'package:gecko/models/walletOptions.dart';
|
import 'package:gecko/models/walletOptions.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:pin_code_fields/pin_code_fields.dart';
|
import 'package:pin_code_fields/pin_code_fields.dart';
|
||||||
|
|
|
@ -5,6 +5,7 @@ import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/history.dart';
|
import 'package:gecko/models/history.dart';
|
||||||
import 'package:gecko/models/myWallets.dart';
|
import 'package:gecko/models/myWallets.dart';
|
||||||
import 'package:gecko/models/queries.dart';
|
import 'package:gecko/models/queries.dart';
|
||||||
|
import 'package:gecko/models/walletData.dart';
|
||||||
import 'package:gecko/models/walletOptions.dart';
|
import 'package:gecko/models/walletOptions.dart';
|
||||||
import 'package:graphql_flutter/graphql_flutter.dart';
|
import 'package:graphql_flutter/graphql_flutter.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
@ -44,7 +45,7 @@ class WalletOptions extends StatelessWidget {
|
||||||
if (_walletOptions.nameController.text.length >= 26 && isTall)
|
if (_walletOptions.nameController.text.length >= 26 && isTall)
|
||||||
_nbrLinesName = 3;
|
_nbrLinesName = 3;
|
||||||
|
|
||||||
_walletOptions.walletID = '0:${wallet.number}';
|
_walletOptions.walletID = [0, wallet.number];
|
||||||
|
|
||||||
_myWalletProvider.getDefaultWallet();
|
_myWalletProvider.getDefaultWallet();
|
||||||
|
|
||||||
|
@ -361,7 +362,7 @@ class WalletOptions extends StatelessWidget {
|
||||||
onTap: !_walletOptions.isDefaultWallet
|
onTap: !_walletOptions.isDefaultWallet
|
||||||
? () {
|
? () {
|
||||||
defaultWallet = wallet;
|
defaultWallet = wallet;
|
||||||
_walletOptions.defAsDefaultWallet(wallet.id());
|
configBox.put('defaultWallet', wallet.id());
|
||||||
_myWalletProvider.readAllWallets(_currentChest);
|
_myWalletProvider.readAllWallets(_currentChest);
|
||||||
}
|
}
|
||||||
: null,
|
: null,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/myWallets.dart';
|
import 'package:gecko/models/myWallets.dart';
|
||||||
|
import 'package:gecko/models/walletData.dart';
|
||||||
import 'package:gecko/models/walletOptions.dart';
|
import 'package:gecko/models/walletOptions.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gecko/screens/commonElements.dart';
|
import 'package:gecko/screens/commonElements.dart';
|
||||||
|
|
|
@ -119,10 +119,10 @@ class OnboardingStepFourteen extends StatelessWidget {
|
||||||
generatedWallet.dewif, _pin.toUpperCase(), _pinLenght);
|
generatedWallet.dewif, _pin.toUpperCase(), _pinLenght);
|
||||||
if (resultWallet) {
|
if (resultWallet) {
|
||||||
pinColor = Colors.green[500];
|
pinColor = Colors.green[500];
|
||||||
await _generateWalletProvider.storeHDWChest(
|
_generateWalletProvider.storeHDWChest(
|
||||||
generatedWallet, 'Mon portefeuille courant', context);
|
generatedWallet, 'Mon portefeuille courant', context);
|
||||||
_myWalletProvider.readAllWallets(_currentChest);
|
_myWalletProvider.readAllWallets(_currentChest);
|
||||||
await _myWalletProvider.getDefaultWalletAsync();
|
_myWalletProvider.getDefaultWallet();
|
||||||
scheduleMicrotask(() {
|
scheduleMicrotask(() {
|
||||||
_walletOptions.reloadBuild();
|
_walletOptions.reloadBuild();
|
||||||
_myWalletProvider.rebuildWidget();
|
_myWalletProvider.rebuildWidget();
|
||||||
|
|
147
pubspec.lock
147
pubspec.lock
|
@ -57,6 +57,62 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.1"
|
version: "1.2.1"
|
||||||
|
build:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: build
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.1"
|
||||||
|
build_config:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: build_config
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
build_daemon:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: build_daemon
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "3.0.1"
|
||||||
|
build_resolvers:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: build_resolvers
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.4"
|
||||||
|
build_runner:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description:
|
||||||
|
name: build_runner
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.4"
|
||||||
|
build_runner_core:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: build_runner_core
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "7.2.2"
|
||||||
|
built_collection:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: built_collection
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "5.1.1"
|
||||||
|
built_value:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: built_value
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "8.1.3"
|
||||||
characters:
|
characters:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -71,6 +127,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.1"
|
version: "1.3.1"
|
||||||
|
checked_yaml:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: checked_yaml
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.1"
|
||||||
cli_util:
|
cli_util:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -85,6 +148,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.0"
|
||||||
|
code_builder:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: code_builder
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "4.1.0"
|
||||||
collection:
|
collection:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -162,6 +232,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.1"
|
version: "3.0.1"
|
||||||
|
dart_style:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: dart_style
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.2.0"
|
||||||
dbus:
|
dbus:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -211,6 +288,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.1"
|
version: "1.0.1"
|
||||||
|
fixnum:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: fixnum
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
flutter:
|
flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -348,6 +432,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.0.0"
|
version: "5.0.0"
|
||||||
|
graphs:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: graphs
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.0"
|
||||||
hive:
|
hive:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -355,6 +446,20 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.4"
|
version: "2.0.4"
|
||||||
|
hive_flutter:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: hive_flutter
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.0"
|
||||||
|
hive_generator:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description:
|
||||||
|
name: hive_generator
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.1"
|
||||||
http:
|
http:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -451,6 +556,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.3"
|
version: "0.6.3"
|
||||||
|
json_annotation:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: json_annotation
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "4.3.0"
|
||||||
logger:
|
logger:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -717,6 +829,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.0"
|
version: "2.1.0"
|
||||||
|
pubspec_parse:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: pubspec_parse
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.0"
|
||||||
qr:
|
qr:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -841,6 +960,20 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.99"
|
version: "0.0.99"
|
||||||
|
source_gen:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: source_gen
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.1"
|
||||||
|
source_helper:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: source_helper
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.3.0"
|
||||||
source_map_stack_trace:
|
source_map_stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -876,6 +1009,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.0"
|
version: "2.1.0"
|
||||||
|
stream_transform:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: stream_transform
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
string_scanner:
|
string_scanner:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -932,6 +1072,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.4.0"
|
version: "0.4.0"
|
||||||
|
timing:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: timing
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
truncate:
|
truncate:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -25,6 +25,7 @@ dependencies:
|
||||||
flutter_svg: ^0.22.0
|
flutter_svg: ^0.22.0
|
||||||
graphql_flutter: ^5.0.0
|
graphql_flutter: ^5.0.0
|
||||||
hive: ^2.0.4
|
hive: ^2.0.4
|
||||||
|
hive_flutter: ^1.1.0
|
||||||
http: ^0.13.0
|
http: ^0.13.0
|
||||||
image_gallery_saver: ^1.6.9
|
image_gallery_saver: ^1.6.9
|
||||||
image_picker: ^0.8.4
|
image_picker: ^0.8.4
|
||||||
|
@ -64,6 +65,8 @@ dev_dependencies:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
integration_test:
|
integration_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
hive_generator: ^1.1.1
|
||||||
|
build_runner: ^2.1.2
|
||||||
|
|
||||||
# The following section is specific to Flutter.
|
# The following section is specific to Flutter.
|
||||||
flutter:
|
flutter:
|
||||||
|
|
Loading…
Reference in New Issue