Migrate to null safety
This commit is contained in:
parent
148302d509
commit
bb090b62ce
|
@ -8,23 +8,23 @@ import 'package:logger/logger.dart';
|
|||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
// Files paths
|
||||
Directory appPath;
|
||||
Directory? appPath;
|
||||
|
||||
String appVersion;
|
||||
SharedPreferences prefs;
|
||||
String endPointGVA;
|
||||
int ramSys;
|
||||
Box<WalletData> walletBox;
|
||||
Box<ChestData> chestBox;
|
||||
Box configBox;
|
||||
Box<G1WalletsList> g1WalletsBox;
|
||||
String? appVersion;
|
||||
SharedPreferences? prefs;
|
||||
String? endPointGVA;
|
||||
int? ramSys;
|
||||
late Box<WalletData> walletBox;
|
||||
late Box<ChestData> chestBox;
|
||||
late Box configBox;
|
||||
late Box<G1WalletsList> g1WalletsBox;
|
||||
|
||||
String cesiumPod = "https://g1.data.le-sou.org";
|
||||
// String cesiumPod = "https://g1.data.e-is.pro";
|
||||
|
||||
// Responsive ratios
|
||||
bool isTall;
|
||||
double ratio;
|
||||
late bool isTall;
|
||||
late double ratio;
|
||||
|
||||
// Logger
|
||||
var log = Logger();
|
||||
|
|
|
@ -124,14 +124,14 @@ Future<void> main() async {
|
|||
}
|
||||
|
||||
class Gecko extends StatelessWidget {
|
||||
const Gecko(this.randomEndpoint, {Key key}) : super(key: key);
|
||||
final String randomEndpoint;
|
||||
const Gecko(this.randomEndpoint, {Key? key}) : super(key: key);
|
||||
final String? randomEndpoint;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
|
||||
final _httpLink = HttpLink(
|
||||
randomEndpoint,
|
||||
randomEndpoint!,
|
||||
);
|
||||
|
||||
final _client = ValueNotifier(
|
||||
|
@ -160,7 +160,7 @@ class Gecko extends StatelessWidget {
|
|||
client: _client,
|
||||
child: MaterialApp(
|
||||
builder: (context, widget) => ResponsiveWrapper.builder(
|
||||
BouncingScrollWrapper.builder(context, widget),
|
||||
BouncingScrollWrapper.builder(context, widget!),
|
||||
maxWidth: 1200,
|
||||
minWidth: 480,
|
||||
defaultScale: true,
|
||||
|
@ -202,7 +202,7 @@ class Gecko extends StatelessWidget {
|
|||
// This http overriding is needed to fix fail certifcat checking for Duniter node on old Android version
|
||||
class MyHttpOverrides extends HttpOverrides {
|
||||
@override
|
||||
HttpClient createHttpClient(SecurityContext context) {
|
||||
HttpClient createHttpClient(SecurityContext? context) {
|
||||
return super.createHttpClient(context)
|
||||
..badCertificateCallback =
|
||||
(X509Certificate cert, String host, int port) => true;
|
||||
|
|
|
@ -8,7 +8,7 @@ import 'package:path_provider/path_provider.dart';
|
|||
|
||||
class CesiumPlusProvider with ChangeNotifier {
|
||||
TextEditingController cesiumName = TextEditingController();
|
||||
Image defaultAvatar(double size) =>
|
||||
Image defaultAvatar(double? size) =>
|
||||
Image.asset(('assets/icon_user.png'), height: size);
|
||||
|
||||
CancelToken avatarCancelToken = CancelToken();
|
||||
|
@ -60,17 +60,17 @@ class CesiumPlusProvider with ChangeNotifier {
|
|||
return [podRequest, queryGetAvatar, headers];
|
||||
}
|
||||
|
||||
Future<String> getName(String _pubkey) async {
|
||||
String _name;
|
||||
Future<String?> getName(String? _pubkey) async {
|
||||
String? _name;
|
||||
|
||||
if (g1WalletsBox.get(_pubkey).csName != null) {
|
||||
return g1WalletsBox.get(_pubkey).csName;
|
||||
if (g1WalletsBox.get(_pubkey)!.csName != null) {
|
||||
return g1WalletsBox.get(_pubkey)!.csName;
|
||||
}
|
||||
|
||||
List queryOptions = await _buildQuery(_pubkey);
|
||||
|
||||
var dio = Dio();
|
||||
Response response;
|
||||
late Response response;
|
||||
try {
|
||||
response = await dio.post(
|
||||
queryOptions[0],
|
||||
|
@ -97,14 +97,14 @@ class CesiumPlusProvider with ChangeNotifier {
|
|||
}
|
||||
_name = response.data['hits']['hits'][0]['_source']['title'];
|
||||
|
||||
g1WalletsBox.get(_pubkey).csName = _name;
|
||||
g1WalletsBox.get(_pubkey)!.csName = _name;
|
||||
|
||||
return _name;
|
||||
}
|
||||
|
||||
Future<Image> getAvatar(String _pubkey, double size) async {
|
||||
Future<Image?> getAvatar(String? _pubkey, double size) async {
|
||||
if (g1WalletsBox.get(_pubkey)?.avatar != null) {
|
||||
return g1WalletsBox.get(_pubkey).avatar;
|
||||
return g1WalletsBox.get(_pubkey)!.avatar;
|
||||
}
|
||||
var dio = Dio();
|
||||
|
||||
|
@ -112,7 +112,7 @@ class CesiumPlusProvider with ChangeNotifier {
|
|||
|
||||
List queryOptions = await _buildQuery(_pubkey);
|
||||
|
||||
Response response;
|
||||
late Response response;
|
||||
try {
|
||||
response = await dio
|
||||
.post(queryOptions[0],
|
||||
|
@ -150,7 +150,7 @@ class CesiumPlusProvider with ChangeNotifier {
|
|||
fit: BoxFit.fitWidth,
|
||||
);
|
||||
|
||||
g1WalletsBox.get(_pubkey).avatar = finalAvatar;
|
||||
g1WalletsBox.get(_pubkey)!.avatar = finalAvatar;
|
||||
|
||||
return finalAvatar;
|
||||
}
|
||||
|
|
|
@ -5,13 +5,13 @@ import 'package:gecko/globals.dart';
|
|||
class ChangePinProvider with ChangeNotifier {
|
||||
bool ischangedPin = false;
|
||||
TextEditingController newPin = TextEditingController();
|
||||
String pinToGive;
|
||||
String? pinToGive;
|
||||
|
||||
NewWallet get badWallet => null;
|
||||
NewWallet? get badWallet => null;
|
||||
|
||||
NewWallet changePin(String _oldPin, {String newCustomPin}) {
|
||||
NewWallet? changePin(String _oldPin, {String? newCustomPin}) {
|
||||
try {
|
||||
final _dewif = chestBox.get(configBox.get('currentChest')).dewif;
|
||||
final _dewif = chestBox.get(configBox.get('currentChest'))!.dewif!;
|
||||
|
||||
// TODO: Durt: Detect if CesiumWallet
|
||||
NewWallet newWalletFile = Dewif().changePassword(
|
||||
|
@ -34,7 +34,7 @@ class ChangePinProvider with ChangeNotifier {
|
|||
// currentChest.dewif = _newWalletFile.dewif;
|
||||
// await chestBox.add(currentChest);
|
||||
|
||||
chestBox.get(configBox.get('currentChest')).dewif = _newWalletFile.dewif;
|
||||
chestBox.get(configBox.get('currentChest'))!.dewif = _newWalletFile.dewif;
|
||||
|
||||
Navigator.pop(context, pinToGive);
|
||||
pinToGive = '';
|
||||
|
|
|
@ -7,22 +7,22 @@ part 'chest_data.g.dart';
|
|||
@HiveType(typeId: 1)
|
||||
class ChestData extends HiveObject {
|
||||
@HiveField(0)
|
||||
String dewif;
|
||||
String? dewif;
|
||||
|
||||
@HiveField(2)
|
||||
String name;
|
||||
String? name;
|
||||
|
||||
@HiveField(3)
|
||||
int defaultWallet;
|
||||
int? defaultWallet;
|
||||
|
||||
@HiveField(4)
|
||||
String imageName;
|
||||
String? imageName;
|
||||
|
||||
@HiveField(5)
|
||||
File imageFile;
|
||||
File? imageFile;
|
||||
|
||||
@HiveField(6)
|
||||
bool isCesium;
|
||||
bool? isCesium;
|
||||
|
||||
ChestData({
|
||||
this.dewif,
|
||||
|
@ -35,6 +35,6 @@ class ChestData extends HiveObject {
|
|||
|
||||
@override
|
||||
String toString() {
|
||||
return name;
|
||||
return name!;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,12 +17,12 @@ class ChestDataAdapter extends TypeAdapter<ChestData> {
|
|||
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
||||
};
|
||||
return ChestData(
|
||||
dewif: fields[0] as String,
|
||||
name: fields[2] as String,
|
||||
defaultWallet: fields[3] as int,
|
||||
imageName: fields[4] as String,
|
||||
imageFile: fields[5] as File,
|
||||
isCesium: fields[6] as bool,
|
||||
dewif: fields[0] as String?,
|
||||
name: fields[2] as String?,
|
||||
defaultWallet: fields[3] as int?,
|
||||
imageName: fields[4] as String?,
|
||||
imageFile: fields[5] as File?,
|
||||
isCesium: fields[6] as bool?,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/models/chest_data.dart';
|
||||
|
@ -8,14 +9,14 @@ class ChestProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future deleteChest(context, ChestData _chest) async {
|
||||
final bool _answer = await _confirmDeletingChest(context, _chest.name);
|
||||
final bool _answer = await (_confirmDeletingChest(context, _chest.name) as FutureOr<bool>);
|
||||
|
||||
if (_answer) {
|
||||
await chestBox.delete(_chest.key);
|
||||
if (chestBox.isEmpty) {
|
||||
await configBox.put('currentChest', 0);
|
||||
} else {
|
||||
int lastChest = chestBox.toMap().keys.first;
|
||||
int? lastChest = chestBox.toMap().keys.first;
|
||||
await configBox.put('currentChest', lastChest);
|
||||
}
|
||||
|
||||
|
@ -27,7 +28,7 @@ class ChestProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
Future<bool> _confirmDeletingChest(context, String _walletName) async {
|
||||
Future<bool?> _confirmDeletingChest(context, String? _walletName) async {
|
||||
return showDialog<bool>(
|
||||
context: context,
|
||||
barrierDismissible: true, // user must tap button!
|
||||
|
|
|
@ -6,25 +6,25 @@ part 'g1_wallets_list.g.dart';
|
|||
@HiveType(typeId: 2)
|
||||
class G1WalletsList {
|
||||
@HiveField(0)
|
||||
String pubkey;
|
||||
String? pubkey;
|
||||
|
||||
@HiveField(1)
|
||||
double balance;
|
||||
double? balance;
|
||||
|
||||
@HiveField(3)
|
||||
Id id;
|
||||
Id? id;
|
||||
|
||||
@HiveField(4)
|
||||
Image avatar;
|
||||
Image? avatar;
|
||||
|
||||
@HiveField(5)
|
||||
String username;
|
||||
String? username;
|
||||
|
||||
@HiveField(6)
|
||||
String csName;
|
||||
String? csName;
|
||||
|
||||
@HiveField(7)
|
||||
bool isMembre;
|
||||
bool? isMembre;
|
||||
|
||||
G1WalletsList({
|
||||
this.pubkey,
|
||||
|
@ -47,7 +47,7 @@ class G1WalletsList {
|
|||
data['pubkey'] = pubkey;
|
||||
data['balance'] = balance;
|
||||
if (id != null) {
|
||||
data['id'] = id.toJson();
|
||||
data['id'] = id!.toJson();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
@ -55,8 +55,8 @@ class G1WalletsList {
|
|||
|
||||
@HiveType(typeId: 3)
|
||||
class Id {
|
||||
bool isMember;
|
||||
String username;
|
||||
bool? isMember;
|
||||
String? username;
|
||||
|
||||
Id({this.isMember, this.username});
|
||||
|
||||
|
|
|
@ -19,13 +19,13 @@ class G1WalletsListAdapter extends TypeAdapter<G1WalletsList> {
|
|||
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
||||
};
|
||||
return G1WalletsList(
|
||||
pubkey: fields[0] as String,
|
||||
balance: fields[1] as double,
|
||||
id: fields[3] as Id,
|
||||
avatar: fields[4] as Image,
|
||||
username: fields[5] as String,
|
||||
csName: fields[6] as String,
|
||||
isMembre: fields[7] as bool,
|
||||
pubkey: fields[0] as String?,
|
||||
balance: fields[1] as double?,
|
||||
id: fields[3] as Id?,
|
||||
avatar: fields[4] as Image?,
|
||||
username: fields[5] as String?,
|
||||
csName: fields[6] as String?,
|
||||
isMembre: fields[7] as bool?,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -15,16 +15,16 @@ import "package:unorm_dart/unorm_dart.dart" as unorm;
|
|||
class GenerateWalletsProvider with ChangeNotifier {
|
||||
GenerateWalletsProvider();
|
||||
// NewWallet generatedWallet;
|
||||
NewWallet actualWallet;
|
||||
NewWallet? actualWallet;
|
||||
|
||||
FocusNode walletNameFocus = FocusNode();
|
||||
Color askedWordColor = Colors.black;
|
||||
Color? askedWordColor = Colors.black;
|
||||
bool isAskedWordValid = false;
|
||||
|
||||
int nbrWord;
|
||||
String nbrWordAlpha;
|
||||
late int nbrWord;
|
||||
String? nbrWordAlpha;
|
||||
|
||||
String generatedMnemonic;
|
||||
String? generatedMnemonic;
|
||||
bool walletIsGenerated = true;
|
||||
|
||||
TextEditingController mnemonicController = TextEditingController();
|
||||
|
@ -37,7 +37,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
bool isCesiumIDVisible = false;
|
||||
bool isCesiumPWDVisible = false;
|
||||
bool canImport = false;
|
||||
CesiumWallet cesiumWallet;
|
||||
late CesiumWallet cesiumWallet;
|
||||
|
||||
// Import Chest
|
||||
TextEditingController cellController0 = TextEditingController();
|
||||
|
@ -58,7 +58,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
NewWallet _wallet, String _name, BuildContext context) async {
|
||||
int chestNumber = 0;
|
||||
chestBox.toMap().forEach((key, value) {
|
||||
if (!value.isCesium) {
|
||||
if (!value.isCesium!) {
|
||||
chestNumber++;
|
||||
}
|
||||
});
|
||||
|
@ -77,7 +77,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
isCesium: false,
|
||||
);
|
||||
await chestBox.add(thisChest);
|
||||
int chestKey = chestBox.keys.last;
|
||||
int? chestKey = chestBox.keys.last;
|
||||
|
||||
WalletData myWallet = WalletData(
|
||||
chest: chestKey,
|
||||
|
@ -128,7 +128,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
return rng.nextInt(12);
|
||||
}
|
||||
|
||||
String intToString(int _nbr) {
|
||||
String? intToString(int _nbr) {
|
||||
Map nbrToString = {};
|
||||
nbrToString[1] = 'Premier';
|
||||
nbrToString[2] = 'Deuxième';
|
||||
|
@ -152,8 +152,8 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<NewWallet> generateWallet(String generatedMnemonic,
|
||||
{@required bool isImport}) async {
|
||||
Future<NewWallet?> generateWallet(String generatedMnemonic,
|
||||
{required bool isImport}) async {
|
||||
try {
|
||||
actualWallet = Dewif().generateDewif(
|
||||
generatedMnemonic, randomSecretCode(5),
|
||||
|
@ -164,14 +164,14 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
|
||||
if (!isImport) {
|
||||
mnemonicController.text = generatedMnemonic;
|
||||
pin.text = actualWallet.password;
|
||||
pin.text = actualWallet!.password;
|
||||
}
|
||||
// notifyListeners();
|
||||
|
||||
return actualWallet;
|
||||
}
|
||||
|
||||
String changePinCode({bool reload}) {
|
||||
String changePinCode({required bool reload}) {
|
||||
pin.text = randomSecretCode(5);
|
||||
if (reload) {
|
||||
notifyListeners();
|
||||
|
@ -179,7 +179,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
return pin.text;
|
||||
}
|
||||
|
||||
Future<Uint8List> printWallet(String _title) async {
|
||||
Future<Uint8List> printWallet(String? _title) async {
|
||||
final ByteData fontData =
|
||||
await rootBundle.load("assets/OpenSans-Regular.ttf");
|
||||
final pw.Font ttf = pw.Font.ttf(fontData.buffer.asByteData());
|
||||
|
@ -197,7 +197,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
pw.Text("Phrase de restauration:",
|
||||
style: pw.TextStyle(fontSize: 20, font: ttf)),
|
||||
pw.SizedBox(height: 10),
|
||||
pw.Text(_title,
|
||||
pw.Text(_title!,
|
||||
style: pw.TextStyle(fontSize: 15, font: ttf),
|
||||
textAlign: pw.TextAlign.center),
|
||||
pw.Expanded(
|
||||
|
@ -226,7 +226,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
log.d(_walletPubkey);
|
||||
}
|
||||
|
||||
Future<int> importCesiumWallet() async {
|
||||
Future<int?> importCesiumWallet() async {
|
||||
// String _walletPubkey = await DubpRust.getLegacyPublicKey(
|
||||
// salt: _cesiumID, password: _cesiumPWD);
|
||||
// String shortPubkey = truncate(_walletPubkey, 9,
|
||||
|
@ -244,7 +244,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
|
||||
int chestNumber = 0;
|
||||
chestBox.toMap().forEach((key, value) {
|
||||
if (value.isCesium) {
|
||||
if (value.isCesium!) {
|
||||
chestNumber++;
|
||||
}
|
||||
});
|
||||
|
@ -268,7 +268,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
isCesium: true);
|
||||
|
||||
await chestBox.add(cesiumChest).then((value) => null);
|
||||
int chestKey = await chestBox.toMap().keys.last;
|
||||
int? chestKey = await chestBox.toMap().keys.last;
|
||||
// chestBox.toMap().
|
||||
await configBox.put('currentChest', chestKey);
|
||||
|
||||
|
@ -299,7 +299,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
String word;
|
||||
int _nbr = 1;
|
||||
|
||||
for (word in generatedMnemonic.split(' ')) {
|
||||
for (word in generatedMnemonic!.split(' ')) {
|
||||
_wordsList.add("$_nbr:$word");
|
||||
_nbr++;
|
||||
}
|
||||
|
@ -318,7 +318,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
|
||||
bool isBipWordsList(List words) {
|
||||
bool isValid = true;
|
||||
for (String word in words) {
|
||||
for (String word in words as Iterable<String>) {
|
||||
// Needed for bad encoding of UTF-8
|
||||
word = word.replaceAll('é', 'é');
|
||||
word = word.replaceAll('è', 'è');
|
||||
|
@ -374,7 +374,7 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
inputMnemonic = inputMnemonic.replaceAll('é', 'é');
|
||||
inputMnemonic = inputMnemonic.replaceAll('è', 'è');
|
||||
|
||||
NewWallet generatedWallet =
|
||||
NewWallet? generatedWallet =
|
||||
await generateWallet(inputMnemonic, isImport: true);
|
||||
|
||||
if (generatedWallet == null) {
|
||||
|
|
|
@ -13,8 +13,7 @@ import 'package:flutter/foundation.dart' show kIsWeb;
|
|||
import 'package:path_provider/path_provider.dart' as pp;
|
||||
|
||||
class HomeProvider with ChangeNotifier {
|
||||
int _currentIndex = 0;
|
||||
bool isSearching;
|
||||
bool? isSearching;
|
||||
Icon searchIcon = const Icon(Icons.search);
|
||||
final TextEditingController searchQuery = TextEditingController();
|
||||
Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850]));
|
||||
|
@ -24,15 +23,8 @@ class HomeProvider with ChangeNotifier {
|
|||
bool isFirstBuild = true;
|
||||
// AudioCache player = AudioCache(prefix: 'sounds/');
|
||||
|
||||
get currentIndex => _currentIndex;
|
||||
|
||||
set currentIndex(int index) {
|
||||
_currentIndex = index;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> initHive() async {
|
||||
Directory hivePath;
|
||||
late Directory hivePath;
|
||||
|
||||
if (!kIsWeb) {
|
||||
if (Platform.isLinux || Platform.isMacOS) {
|
||||
|
@ -70,14 +62,14 @@ class HomeProvider with ChangeNotifier {
|
|||
return version + '+' + buildNumber;
|
||||
}
|
||||
|
||||
Future<String> getValidEndpoint() async {
|
||||
Future<String?> getValidEndpoint() async {
|
||||
List _listEndpoints = await rootBundle
|
||||
.loadString('config/gva_endpoints.json')
|
||||
.then((jsonStr) => jsonDecode(jsonStr));
|
||||
_listEndpoints.shuffle();
|
||||
|
||||
int i = 0;
|
||||
String _endpoint;
|
||||
String? _endpoint;
|
||||
int _statusCode = 0;
|
||||
|
||||
final _client = HttpClient();
|
||||
|
@ -118,7 +110,7 @@ class HomeProvider with ChangeNotifier {
|
|||
}
|
||||
} while (_statusCode != 400);
|
||||
|
||||
log.i('ENDPOINT: ' + _endpoint);
|
||||
log.i('ENDPOINT: ' + _endpoint!);
|
||||
return _endpoint;
|
||||
}
|
||||
|
||||
|
@ -159,7 +151,7 @@ class HomeProvider with ChangeNotifier {
|
|||
_message =
|
||||
"Aucun noeud Duniter disponible, veuillez réessayer ultérieurement";
|
||||
} else {
|
||||
_message = "Vous êtes connecté au noeud\n${endPointGVA.split('/')[2]}";
|
||||
_message = "Vous êtes connecté au noeud\n${endPointGVA!.split('/')[2]}";
|
||||
}
|
||||
final snackBar = SnackBar(
|
||||
content: Text(_message), duration: const Duration(seconds: 2));
|
||||
|
|
|
@ -5,10 +5,10 @@ import 'package:gecko/models/wallet_data.dart';
|
|||
|
||||
class MyWalletsProvider with ChangeNotifier {
|
||||
List<WalletData> listWallets = [];
|
||||
String pinCode;
|
||||
int pinLenght;
|
||||
late String pinCode;
|
||||
int? pinLenght;
|
||||
|
||||
int getCurrentChest() {
|
||||
int? getCurrentChest() {
|
||||
if (configBox.get('currentChest') == null) {
|
||||
configBox.put('currentChest', 0);
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
List<WalletData> readAllWallets(int _chest) {
|
||||
List<WalletData> readAllWallets(int? _chest) {
|
||||
listWallets.clear();
|
||||
walletBox.toMap().forEach((key, value) {
|
||||
if (value.chest == _chest) {
|
||||
|
@ -36,11 +36,11 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
return listWallets;
|
||||
}
|
||||
|
||||
WalletData getWalletData(List<int> _id) {
|
||||
WalletData? getWalletData(List<int?> _id) {
|
||||
if (_id.isEmpty) return WalletData();
|
||||
int _chest = _id[0];
|
||||
int _nbr = _id[1];
|
||||
WalletData _targetedWallet;
|
||||
int? _chest = _id[0];
|
||||
int? _nbr = _id[1];
|
||||
WalletData? _targetedWallet;
|
||||
|
||||
walletBox.toMap().forEach((key, value) {
|
||||
if (value.chest == _chest && value.number == _nbr) {
|
||||
|
@ -52,11 +52,11 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
return _targetedWallet;
|
||||
}
|
||||
|
||||
WalletData getDefaultWallet(int chest) {
|
||||
WalletData? getDefaultWallet(int? chest) {
|
||||
if (chestBox.isEmpty) {
|
||||
return WalletData(chest: 0, number: 0);
|
||||
} else {
|
||||
int defaultWalletNumber = chestBox.get(chest).defaultWallet;
|
||||
int? defaultWalletNumber = chestBox.get(chest)!.defaultWallet;
|
||||
return getWalletData([chest, defaultWalletNumber]);
|
||||
}
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
try {
|
||||
log.w('DELETE ALL WALLETS ?');
|
||||
|
||||
final bool _answer = await _confirmDeletingAllWallets(context);
|
||||
final bool _answer = await (_confirmDeletingAllWallets(context) as FutureOr<bool>);
|
||||
if (_answer) {
|
||||
await walletBox.clear();
|
||||
await chestBox.clear();
|
||||
|
@ -84,7 +84,7 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
Future<bool> _confirmDeletingAllWallets(context) async {
|
||||
Future<bool?> _confirmDeletingAllWallets(context) async {
|
||||
return showDialog<bool>(
|
||||
context: context,
|
||||
barrierDismissible: true, // user must tap button!
|
||||
|
@ -116,15 +116,15 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
Future<void> generateNewDerivation(context, String _name) async {
|
||||
int _newDerivationNbr;
|
||||
int _newWalletNbr;
|
||||
int _chest = getCurrentChest();
|
||||
int? _chest = getCurrentChest();
|
||||
List<WalletData> _walletConfig = readAllWallets(_chest);
|
||||
|
||||
if (_walletConfig.isEmpty) {
|
||||
_newDerivationNbr = 3;
|
||||
_newWalletNbr = 0;
|
||||
} else {
|
||||
_newDerivationNbr = _walletConfig.last.derivation + 3;
|
||||
_newWalletNbr = _walletConfig.last.number + 1;
|
||||
_newDerivationNbr = _walletConfig.last.derivation! + 3;
|
||||
_newWalletNbr = _walletConfig.last.number! + 1;
|
||||
}
|
||||
|
||||
WalletData newWallet = WalletData(
|
||||
|
|
|
@ -25,7 +25,7 @@ class SearchProvider with ChangeNotifier {
|
|||
// final response = await http.get(url);
|
||||
|
||||
var dio = Dio();
|
||||
Response response;
|
||||
late Response response;
|
||||
try {
|
||||
response = await dio.get(
|
||||
'https://g1-stats.axiom-team.fr/data/forbes.json',
|
||||
|
@ -40,8 +40,8 @@ class SearchProvider with ChangeNotifier {
|
|||
log.e(e);
|
||||
}
|
||||
|
||||
List<G1WalletsList> _listWallets = _parseG1Wallets(response.data);
|
||||
Map<String, G1WalletsList> _mapWallets = {
|
||||
List<G1WalletsList> _listWallets = _parseG1Wallets(response.data)!;
|
||||
Map<String?, G1WalletsList> _mapWallets = {
|
||||
for (var e in _listWallets) e.pubkey: e
|
||||
};
|
||||
|
||||
|
@ -51,11 +51,11 @@ class SearchProvider with ChangeNotifier {
|
|||
|
||||
g1WalletsBox.toMap().forEach((key, value) {
|
||||
if ((value.id != null &&
|
||||
value.id.username != null &&
|
||||
value.id.username
|
||||
value.id!.username != null &&
|
||||
value.id!.username!
|
||||
.toLowerCase()
|
||||
.contains(searchController.text)) ||
|
||||
value.pubkey.contains(searchController.text)) {
|
||||
value.pubkey!.contains(searchController.text)) {
|
||||
searchResult.add(value);
|
||||
return;
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ class SearchProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
List<G1WalletsList> _parseG1Wallets(var responseBody) {
|
||||
List<G1WalletsList>? _parseG1Wallets(var responseBody) {
|
||||
final parsed = responseBody.cast<Map<String, dynamic>>();
|
||||
|
||||
return parsed
|
||||
|
|
|
@ -7,22 +7,22 @@ part 'wallet_data.g.dart';
|
|||
@HiveType(typeId: 0)
|
||||
class WalletData extends HiveObject {
|
||||
@HiveField(0)
|
||||
int chest;
|
||||
int? chest;
|
||||
|
||||
@HiveField(1)
|
||||
int number;
|
||||
int? number;
|
||||
|
||||
@HiveField(2)
|
||||
String name;
|
||||
String? name;
|
||||
|
||||
@HiveField(3)
|
||||
int derivation;
|
||||
int? derivation;
|
||||
|
||||
@HiveField(4)
|
||||
String imageName;
|
||||
String? imageName;
|
||||
|
||||
@HiveField(5)
|
||||
File imageFile;
|
||||
File? imageFile;
|
||||
|
||||
WalletData(
|
||||
{this.chest,
|
||||
|
@ -35,7 +35,7 @@ class WalletData extends HiveObject {
|
|||
// representation of WalletData when debugging
|
||||
@override
|
||||
String toString() {
|
||||
return name;
|
||||
return name!;
|
||||
}
|
||||
|
||||
// creates the ':'-separated string from the WalletData
|
||||
|
@ -44,7 +44,7 @@ class WalletData extends HiveObject {
|
|||
}
|
||||
|
||||
// returns only the id part of the ':'-separated string
|
||||
List<int> id() {
|
||||
List<int?> id() {
|
||||
return [chest, number];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,12 +17,12 @@ class WalletDataAdapter extends TypeAdapter<WalletData> {
|
|||
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,
|
||||
imageName: fields[4] as String,
|
||||
imageFile: fields[5] as File,
|
||||
chest: fields[0] as int?,
|
||||
number: fields[1] as int?,
|
||||
name: fields[2] as String?,
|
||||
derivation: fields[3] as int?,
|
||||
imageName: fields[4] as String?,
|
||||
imageFile: fields[5] as File?,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,12 +21,12 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
bool isBalanceBlur = true;
|
||||
FocusNode walletNameFocus = FocusNode();
|
||||
TextEditingController nameController = TextEditingController();
|
||||
bool isDefaultWallet;
|
||||
late bool isDefaultWallet;
|
||||
|
||||
Future<NewWallet> get badWallet => null;
|
||||
Future<NewWallet>? get badWallet => null;
|
||||
|
||||
String _getPubkeyFromDewif(
|
||||
String _dewif, _pin, int _pinLenght, int derivation) {
|
||||
String? _dewif, _pin, int _pinLenght, int? derivation) {
|
||||
RegExp regExp = RegExp(
|
||||
r'^[A-Z0-9]+$',
|
||||
caseSensitive: false,
|
||||
|
@ -39,25 +39,25 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
}
|
||||
if (derivation != -1) {
|
||||
try {
|
||||
final _wallet = HdWallet.fromDewif(_dewif, _pin);
|
||||
pubkey.text = _wallet.getPubkey(derivation);
|
||||
final _wallet = HdWallet.fromDewif(_dewif!, _pin);
|
||||
pubkey.text = _wallet.getPubkey(derivation!);
|
||||
log.d(pubkey.text);
|
||||
notifyListeners();
|
||||
|
||||
return pubkey.text;
|
||||
} catch (e) {
|
||||
log.w('Bad PIN code !\n' + e);
|
||||
log.w('Bad PIN code !\n' + e.toString());
|
||||
notifyListeners();
|
||||
|
||||
return 'false';
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
pubkey.text = CesiumWallet.fromDewif(_dewif, _pin).pubkey;
|
||||
pubkey.text = CesiumWallet.fromDewif(_dewif!, _pin).pubkey;
|
||||
notifyListeners();
|
||||
return pubkey.text;
|
||||
} catch (e) {
|
||||
log.w('Bad PIN code !\n' + e);
|
||||
log.w('Bad PIN code !\n' + e.toString());
|
||||
notifyListeners();
|
||||
|
||||
return 'false';
|
||||
|
@ -65,11 +65,11 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
String readLocalWallet(
|
||||
String? readLocalWallet(
|
||||
context, WalletData _wallet, String _pin, int _pinLenght) {
|
||||
isWalletUnlock = false;
|
||||
try {
|
||||
String _localDewif = chestBox.get(_wallet.chest).dewif;
|
||||
String? _localDewif = chestBox.get(_wallet.chest)!.dewif;
|
||||
String _localPubkey;
|
||||
|
||||
if ((_localPubkey = _getPubkeyFromDewif(
|
||||
|
@ -108,15 +108,15 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
return 5;
|
||||
}
|
||||
|
||||
void _renameWallet(List<int> _walletID, _newName, {bool isCesium}) async {
|
||||
void _renameWallet(List<int?> _walletID, _newName, {required bool isCesium}) async {
|
||||
if (isCesium) {
|
||||
ChestData _chestTarget = chestBox.get(_walletID[0]);
|
||||
ChestData _chestTarget = chestBox.get(_walletID[0])!;
|
||||
_chestTarget.name = _newName;
|
||||
await chestBox.put(_chestTarget.key, _chestTarget);
|
||||
} else {
|
||||
MyWalletsProvider myWalletClass = MyWalletsProvider();
|
||||
|
||||
WalletData _walletTarget = myWalletClass.getWalletData(_walletID);
|
||||
WalletData _walletTarget = myWalletClass.getWalletData(_walletID)!;
|
||||
_walletTarget.name = _newName;
|
||||
await walletBox.put(_walletTarget.key, _walletTarget);
|
||||
}
|
||||
|
@ -124,12 +124,12 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
_newWalletName.text = '';
|
||||
}
|
||||
|
||||
bool editWalletName(List<int> _wID, {bool isCesium}) {
|
||||
bool editWalletName(List<int?> _wID, {bool? isCesium}) {
|
||||
bool nameState;
|
||||
if (isEditing) {
|
||||
if (!nameController.text.contains(':') &&
|
||||
nameController.text.length <= 39) {
|
||||
_renameWallet(_wID, nameController.text, isCesium: isCesium);
|
||||
_renameWallet(_wID, nameController.text, isCesium: isCesium!);
|
||||
nameState = true;
|
||||
} else {
|
||||
nameState = false;
|
||||
|
@ -144,7 +144,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<int> deleteWallet(context, WalletData wallet) async {
|
||||
final bool _answer = await _confirmDeletingWallet(context, wallet.name);
|
||||
final bool _answer = await (_confirmDeletingWallet(context, wallet.name) as FutureOr<bool>);
|
||||
|
||||
if (_answer) {
|
||||
walletBox.delete(wallet.key);
|
||||
|
@ -157,7 +157,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
return 0;
|
||||
}
|
||||
|
||||
Future<bool> _confirmDeletingWallet(context, _walletName) async {
|
||||
Future<bool?> _confirmDeletingWallet(context, _walletName) async {
|
||||
return showDialog<bool>(
|
||||
context: context,
|
||||
barrierDismissible: true, // user must tap button!
|
||||
|
@ -224,7 +224,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
File _image;
|
||||
final picker = ImagePicker();
|
||||
|
||||
XFile pickedFile = await picker.pickImage(source: ImageSource.gallery);
|
||||
XFile? pickedFile = await picker.pickImage(source: ImageSource.gallery);
|
||||
|
||||
if (pickedFile != null) {
|
||||
_image = File(pickedFile.path);
|
||||
|
|
|
@ -19,18 +19,18 @@ import 'package:fast_base58/fast_base58.dart';
|
|||
class WalletsProfilesProvider with ChangeNotifier {
|
||||
WalletsProfilesProvider(this.pubkey);
|
||||
|
||||
String pubkey = '';
|
||||
String? pubkey = '';
|
||||
String pubkeyShort = '';
|
||||
final TextEditingController outputPubkey = TextEditingController();
|
||||
List transBC;
|
||||
String fetchMoreCursor;
|
||||
Map pageInfo;
|
||||
List? transBC;
|
||||
String? fetchMoreCursor;
|
||||
Map? pageInfo;
|
||||
bool isHistoryScreen = false;
|
||||
String historySwitchButtun = "Voir l'historique";
|
||||
String rawSvg;
|
||||
String? rawSvg;
|
||||
TextEditingController payAmount = TextEditingController();
|
||||
TextEditingController payComment = TextEditingController();
|
||||
num balance;
|
||||
num? balance;
|
||||
int nRepositories = 20;
|
||||
int nPage = 1;
|
||||
|
||||
|
@ -38,7 +38,7 @@ class WalletsProfilesProvider with ChangeNotifier {
|
|||
if (Platform.isAndroid || Platform.isIOS) {
|
||||
await Permission.camera.request();
|
||||
}
|
||||
String barcode;
|
||||
String? barcode;
|
||||
try {
|
||||
barcode = await scanner.scan();
|
||||
} catch (e) {
|
||||
|
@ -61,20 +61,20 @@ class WalletsProfilesProvider with ChangeNotifier {
|
|||
|
||||
Future<String> pay(BuildContext context, String pinCode) async {
|
||||
MyWalletsProvider _myWalletModel = MyWalletsProvider();
|
||||
int currentChest = configBox.get('currentChest');
|
||||
WalletData defaultWallet = _myWalletModel.getDefaultWallet(currentChest);
|
||||
int? currentChest = configBox.get('currentChest');
|
||||
WalletData? defaultWallet = _myWalletModel.getDefaultWallet(currentChest);
|
||||
|
||||
String dewif = chestBox.get(currentChest).dewif;
|
||||
int derivation;
|
||||
String dewif = chestBox.get(currentChest)!.dewif!;
|
||||
int? derivation;
|
||||
|
||||
if (chestBox.get(currentChest).isCesium) {
|
||||
if (chestBox.get(currentChest)!.isCesium!) {
|
||||
derivation = -1;
|
||||
} else {
|
||||
derivation = defaultWallet.derivation;
|
||||
derivation = defaultWallet!.derivation;
|
||||
}
|
||||
|
||||
String result = await Gva(node: endPointGVA).pay(
|
||||
recipient: pubkey,
|
||||
String result = await Gva(node: endPointGVA!).pay(
|
||||
recipient: pubkey!,
|
||||
amount: double.parse(payAmount.text),
|
||||
dewif: dewif,
|
||||
password: pinCode,
|
||||
|
@ -147,7 +147,7 @@ class WalletsProfilesProvider with ChangeNotifier {
|
|||
for (final trans in txs) {
|
||||
var direction = trans['direction'];
|
||||
final transaction = trans['node'];
|
||||
String output;
|
||||
String? output;
|
||||
if (direction == "RECEIVED") {
|
||||
for (String line in transaction['outputs']) {
|
||||
if (line.contains(_pubkey)) {
|
||||
|
@ -194,14 +194,14 @@ class WalletsProfilesProvider with ChangeNotifier {
|
|||
return transBC;
|
||||
}
|
||||
|
||||
FetchMoreOptions checkQueryResult(result, opts, _pubkey) {
|
||||
final List<dynamic> blockchainTX =
|
||||
(result.data['txsHistoryBc']['both']['edges'] as List<dynamic>);
|
||||
FetchMoreOptions? checkQueryResult(result, opts, _pubkey) {
|
||||
final List<dynamic>? blockchainTX =
|
||||
(result.data['txsHistoryBc']['both']['edges'] as List<dynamic>?);
|
||||
// final List<dynamic> mempoolTX =
|
||||
// (result.data['txsHistoryMp']['receiving'] as List<dynamic>);
|
||||
|
||||
pageInfo = result.data['txsHistoryBc']['both']['pageInfo'];
|
||||
fetchMoreCursor = pageInfo['endCursor'];
|
||||
fetchMoreCursor = pageInfo!['endCursor'];
|
||||
if (fetchMoreCursor == null) nPage = 1;
|
||||
|
||||
if (nPage == 1) {
|
||||
|
@ -216,9 +216,9 @@ class WalletsProfilesProvider with ChangeNotifier {
|
|||
variables: {'cursor': fetchMoreCursor, 'number': nRepositories},
|
||||
updateQuery: (previousResultData, fetchMoreResultData) {
|
||||
final List<dynamic> repos = [
|
||||
...previousResultData['txsHistoryBc']['both']['edges']
|
||||
...previousResultData!['txsHistoryBc']['both']['edges']
|
||||
as List<dynamic>,
|
||||
...fetchMoreResultData['txsHistoryBc']['both']['edges']
|
||||
...fetchMoreResultData!['txsHistoryBc']['both']['edges']
|
||||
as List<dynamic>
|
||||
];
|
||||
|
||||
|
@ -287,7 +287,7 @@ class WalletsProfilesProvider with ChangeNotifier {
|
|||
// return balance;
|
||||
// }
|
||||
|
||||
Future<num> getBalance(String _pubkey) async {
|
||||
Future<num?> getBalance(String? _pubkey) async {
|
||||
while (balance == null) {
|
||||
await Future.delayed(const Duration(milliseconds: 50));
|
||||
}
|
||||
|
|
|
@ -8,11 +8,11 @@ import 'package:flutter/material.dart';
|
|||
class AvatarFullscreen extends StatelessWidget {
|
||||
TextEditingController tplController = TextEditingController();
|
||||
|
||||
AvatarFullscreen(this.avatar, {this.title, this.color, Key key})
|
||||
AvatarFullscreen(this.avatar, {this.title, this.color, Key? key})
|
||||
: super(key: key);
|
||||
final Image avatar;
|
||||
final String title;
|
||||
final Color color;
|
||||
final Image? avatar;
|
||||
final String? title;
|
||||
final Color? color;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -43,8 +43,8 @@ class AvatarFullscreen extends StatelessWidget {
|
|||
// height: MediaQuery.of(context).size.height,
|
||||
// width: MediaQuery.of(context).size.width,
|
||||
child: Image(
|
||||
image: avatar.image,
|
||||
height: avatar.height,
|
||||
image: avatar!.image,
|
||||
height: avatar!.height,
|
||||
fit: BoxFit.fitWidth),
|
||||
),
|
||||
),
|
||||
|
|
|
@ -8,7 +8,7 @@ class CommonElements {
|
|||
return const Text('Coucou');
|
||||
}
|
||||
|
||||
Widget bubbleSpeak(String text, {double long, Key textKey}) {
|
||||
Widget bubbleSpeak(String text, {double? long, Key? textKey}) {
|
||||
return Bubble(
|
||||
padding: long == null
|
||||
? const BubbleEdges.all(18)
|
||||
|
@ -26,7 +26,7 @@ class CommonElements {
|
|||
);
|
||||
}
|
||||
|
||||
Widget bubbleSpeakRich(List<TextSpan> text, {Key textKey}) {
|
||||
Widget bubbleSpeakRich(List<TextSpan> text, {Key? textKey}) {
|
||||
return Bubble(
|
||||
padding: const BubbleEdges.all(18),
|
||||
elevation: 5,
|
||||
|
@ -130,7 +130,7 @@ class CommonElements {
|
|||
}
|
||||
|
||||
class SmoothTransition extends PageRouteBuilder {
|
||||
final Widget page;
|
||||
final Widget? page;
|
||||
SmoothTransition({this.page})
|
||||
: super(
|
||||
pageBuilder: (
|
||||
|
@ -141,8 +141,8 @@ class SmoothTransition extends PageRouteBuilder {
|
|||
TweenAnimationBuilder(
|
||||
duration: const Duration(seconds: 5),
|
||||
tween: Tween(begin: 200, end: 200),
|
||||
builder: (BuildContext context, dynamic value, Widget child) {
|
||||
return page;
|
||||
builder: (BuildContext context, dynamic value, Widget? child) {
|
||||
return page!;
|
||||
},
|
||||
),
|
||||
);
|
||||
|
@ -152,7 +152,7 @@ class FaderTransition extends PageRouteBuilder {
|
|||
final Widget page;
|
||||
final bool isFast;
|
||||
|
||||
FaderTransition({@required this.page, @required this.isFast})
|
||||
FaderTransition({required this.page, required this.isFast})
|
||||
: super(
|
||||
pageBuilder: (
|
||||
BuildContext context,
|
||||
|
@ -175,7 +175,7 @@ class FaderTransition extends PageRouteBuilder {
|
|||
}
|
||||
|
||||
class SlideLeftRoute extends PageRouteBuilder {
|
||||
final Widget page;
|
||||
final Widget? page;
|
||||
SlideLeftRoute({this.page})
|
||||
: super(
|
||||
pageBuilder: (
|
||||
|
@ -183,7 +183,7 @@ class SlideLeftRoute extends PageRouteBuilder {
|
|||
Animation<double> animation,
|
||||
Animation<double> secondaryAnimation,
|
||||
) =>
|
||||
page,
|
||||
page!,
|
||||
transitionsBuilder: (
|
||||
BuildContext context,
|
||||
Animation<double> animation,
|
||||
|
@ -207,7 +207,7 @@ class GeckoSpeechAppBar extends StatelessWidget with PreferredSizeWidget {
|
|||
|
||||
GeckoSpeechAppBar(
|
||||
this.title, {
|
||||
Key key,
|
||||
Key? key,
|
||||
}) : preferredSize = const Size.fromHeight(105.4),
|
||||
super(key: key);
|
||||
|
||||
|
|
|
@ -12,16 +12,16 @@ import 'package:provider/provider.dart';
|
|||
|
||||
// ignore: must_be_immutable
|
||||
class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
||||
HistoryScreen({@required this.pubkey, this.avatar, this.username, Key key})
|
||||
HistoryScreen({required this.pubkey, this.avatar, this.username, Key? key})
|
||||
: super(key: key);
|
||||
final ScrollController scrollController = ScrollController();
|
||||
final double avatarsSize = 80;
|
||||
final String pubkey;
|
||||
final String username;
|
||||
final Image avatar;
|
||||
final String? pubkey;
|
||||
final String? username;
|
||||
final Image? avatar;
|
||||
|
||||
FetchMore fetchMore;
|
||||
FetchMoreOptions opts;
|
||||
FetchMore? fetchMore;
|
||||
FetchMoreOptions? opts;
|
||||
|
||||
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
||||
|
||||
|
@ -32,8 +32,8 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
||||
CesiumPlusProvider _cesiumPlusProvider =
|
||||
Provider.of<CesiumPlusProvider>(context, listen: false);
|
||||
log.i('Build pubkey : ' + pubkey);
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {});
|
||||
log.i('Build pubkey : ' + pubkey!);
|
||||
WidgetsBinding.instance!.addPostFrameCallback((_) {});
|
||||
|
||||
_historyProvider.balance = _historyProvider.transBC = null;
|
||||
|
||||
|
@ -72,7 +72,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
},
|
||||
),
|
||||
builder: (QueryResult result, {fetchMore, refetch}) {
|
||||
if (result.isLoading && result?.data == null) {
|
||||
if (result.isLoading && result.data == null) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
|
@ -87,7 +87,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
style: TextStyle(fontSize: 18),
|
||||
)
|
||||
]);
|
||||
} else if (result?.data == null) {
|
||||
} else if (result.data == null) {
|
||||
return Column(children: const <Widget>[
|
||||
SizedBox(height: 50),
|
||||
Text(
|
||||
|
@ -97,11 +97,11 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
]);
|
||||
}
|
||||
|
||||
if (result?.data['balance'] == null) {
|
||||
if (result.data!['balance'] == null) {
|
||||
_historyProvider.balance = 0.0;
|
||||
} else {
|
||||
_historyProvider.balance = _historyProvider
|
||||
.removeDecimalZero(result.data['balance']['amount'] / 100);
|
||||
.removeDecimalZero(result.data!['balance']['amount'] / 100);
|
||||
}
|
||||
|
||||
if (result.isNotLoading) {
|
||||
|
@ -120,13 +120,13 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
),
|
||||
),
|
||||
),
|
||||
onNotification: (t) {
|
||||
onNotification: (dynamic t) {
|
||||
if (t is ScrollEndNotification &&
|
||||
scrollController.position.pixels >=
|
||||
scrollController.position.maxScrollExtent * 0.7 &&
|
||||
_historyProvider.pageInfo['hasPreviousPage'] &&
|
||||
_historyProvider.pageInfo!['hasPreviousPage'] &&
|
||||
result.isNotLoading) {
|
||||
fetchMore(opts);
|
||||
fetchMore!(opts!);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
@ -151,14 +151,14 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
: Column(children: <Widget>[
|
||||
getTransactionTile(context, _historyProvider),
|
||||
if (result.isLoading &&
|
||||
_historyProvider.pageInfo['hasPreviousPage'])
|
||||
_historyProvider.pageInfo!['hasPreviousPage'])
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: const <Widget>[
|
||||
CircularProgressIndicator(),
|
||||
],
|
||||
),
|
||||
if (!_historyProvider.pageInfo['hasPreviousPage'])
|
||||
if (!_historyProvider.pageInfo!['hasPreviousPage'])
|
||||
Column(
|
||||
children: const <Widget>[
|
||||
SizedBox(height: 15),
|
||||
|
@ -176,8 +176,8 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
CesiumPlusProvider _cesiumPlusProvider =
|
||||
Provider.of<CesiumPlusProvider>(context, listen: false);
|
||||
int keyID = 0;
|
||||
String dateDelimiter;
|
||||
String lastDateDelimiter;
|
||||
String? dateDelimiter;
|
||||
String? lastDateDelimiter;
|
||||
const double _avatarSize = 200;
|
||||
|
||||
bool isTody = false;
|
||||
|
@ -200,15 +200,15 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
};
|
||||
|
||||
return Column(
|
||||
children: _historyProvider.transBC.map((repository) {
|
||||
children: _historyProvider.transBC!.map((repository) {
|
||||
DateTime now = DateTime.now();
|
||||
DateTime date = DateTime.fromMillisecondsSinceEpoch(repository[0] * 1000);
|
||||
|
||||
String dateForm;
|
||||
if ({4, 10, 11, 12}.contains(date.month)) {
|
||||
dateForm = "${date.day} ${monthsInYear[date.month].substring(0, 3)}.";
|
||||
dateForm = "${date.day} ${monthsInYear[date.month]!.substring(0, 3)}.";
|
||||
} else if ({1, 2, 7, 9}.contains(date.month)) {
|
||||
dateForm = "${date.day} ${monthsInYear[date.month].substring(0, 4)}.";
|
||||
dateForm = "${date.day} ${monthsInYear[date.month]!.substring(0, 4)}.";
|
||||
} else {
|
||||
dateForm = "${date.day} ${monthsInYear[date.month]}";
|
||||
}
|
||||
|
@ -258,7 +258,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 30),
|
||||
child: Text(
|
||||
dateDelimiter,
|
||||
dateDelimiter!,
|
||||
style: TextStyle(
|
||||
fontSize: 23, color: orangeC, fontWeight: FontWeight.w300),
|
||||
),
|
||||
|
@ -276,7 +276,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
future: _cesiumPlusProvider.getAvatar(
|
||||
repository[2], _avatarSize),
|
||||
builder: (BuildContext context,
|
||||
AsyncSnapshot<Image> _avatar) {
|
||||
AsyncSnapshot<Image?> _avatar) {
|
||||
if (_avatar.connectionState !=
|
||||
ConnectionState.done ||
|
||||
_avatar.hasError) {
|
||||
|
@ -295,11 +295,11 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
]);
|
||||
}
|
||||
if (_avatar.hasData) {
|
||||
g1WalletsBox.get(repository[2]).avatar =
|
||||
_avatar?.data;
|
||||
return ClipOval(child: _avatar?.data);
|
||||
g1WalletsBox.get(repository[2])!.avatar =
|
||||
_avatar.data;
|
||||
return ClipOval(child: _avatar.data);
|
||||
} else {
|
||||
g1WalletsBox.get(repository[2]).avatar =
|
||||
g1WalletsBox.get(repository[2])!.avatar =
|
||||
_cesiumPlusProvider
|
||||
.defaultAvatar(repository[2]);
|
||||
return _cesiumPlusProvider
|
||||
|
@ -308,7 +308,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
})
|
||||
: ClipOval(
|
||||
child: Image(
|
||||
image: g1WalletsBox.get(repository[2]).avatar.image,
|
||||
image: g1WalletsBox.get(repository[2])!.avatar!.image,
|
||||
height: _avatarSize,
|
||||
),
|
||||
),
|
||||
|
@ -407,7 +407,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
_historyProvider.snackCopyKey(context);
|
||||
},
|
||||
child: Text(
|
||||
_historyProvider.getShortPubkey(pubkey),
|
||||
_historyProvider.getShortPubkey(pubkey!),
|
||||
style: const TextStyle(
|
||||
fontSize: 30,
|
||||
fontWeight: FontWeight.w800,
|
||||
|
@ -425,17 +425,17 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
},
|
||||
),
|
||||
builder: (QueryResult result,
|
||||
{VoidCallback refetch, FetchMore fetchMore}) {
|
||||
{VoidCallback? refetch, FetchMore? fetchMore}) {
|
||||
if (result.isLoading || result.hasException) {
|
||||
return const Text('...');
|
||||
} else if (result?.data['idty'] == null ||
|
||||
result?.data['idty']['username'] == null) {
|
||||
} else if (result.data!['idty'] == null ||
|
||||
result.data!['idty']['username'] == null) {
|
||||
return const Text('');
|
||||
} else {
|
||||
return SizedBox(
|
||||
width: 230,
|
||||
child: Text(
|
||||
result?.data['idty']['username'] ?? '',
|
||||
result.data!['idty']['username'] ?? '',
|
||||
style: const TextStyle(
|
||||
fontSize: 27,
|
||||
color: Color(0xff814C00),
|
||||
|
@ -449,7 +449,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
SizedBox(
|
||||
width: 230,
|
||||
child: Text(
|
||||
username,
|
||||
username!,
|
||||
style: const TextStyle(
|
||||
fontSize: 27,
|
||||
color: Color(0xff814C00),
|
||||
|
@ -461,13 +461,13 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
FutureBuilder(
|
||||
future: _historyProvider.getBalance(pubkey),
|
||||
builder:
|
||||
(BuildContext context, AsyncSnapshot<num> _balance) {
|
||||
(BuildContext context, AsyncSnapshot<num?> _balance) {
|
||||
if (_balance.connectionState != ConnectionState.done ||
|
||||
_balance.hasError) {
|
||||
return const Text('...');
|
||||
}
|
||||
return Text(
|
||||
"${_balance?.data.toString()} Ğ1",
|
||||
"${_balance.data.toString()} Ğ1",
|
||||
textAlign: TextAlign.center,
|
||||
style: const TextStyle(
|
||||
fontSize: 22, fontWeight: FontWeight.w500),
|
||||
|
@ -481,7 +481,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
FutureBuilder(
|
||||
future: _cesiumPlusProvider.getAvatar(pubkey, _avatarSize),
|
||||
builder:
|
||||
(BuildContext context, AsyncSnapshot<Image> _avatar) {
|
||||
(BuildContext context, AsyncSnapshot<Image?> _avatar) {
|
||||
if (_avatar.connectionState != ConnectionState.done) {
|
||||
return Stack(children: [
|
||||
ClipOval(
|
||||
|
@ -507,13 +507,13 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) {
|
||||
return AvatarFullscreen(_avatar?.data);
|
||||
return AvatarFullscreen(_avatar.data);
|
||||
}),
|
||||
);
|
||||
},
|
||||
child: ClipOval(
|
||||
child: Image(
|
||||
image: _avatar?.data?.image,
|
||||
image: _avatar.data!.image,
|
||||
height: _avatarSize,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
|
@ -537,7 +537,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
|
|||
},
|
||||
child: ClipOval(
|
||||
child: Image(
|
||||
image: avatar.image,
|
||||
image: avatar!.image,
|
||||
height: _avatarSize,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
|
|
|
@ -15,7 +15,7 @@ import 'package:flutter/services.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
|
||||
class HomeScreen extends StatelessWidget {
|
||||
const HomeScreen({Key key}) : super(key: key);
|
||||
const HomeScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -84,7 +84,7 @@ class HomeScreen extends StatelessWidget {
|
|||
body: Builder(
|
||||
builder: (ctx) => StatefulWrapper(
|
||||
onInit: () {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
WidgetsBinding.instance!.addPostFrameCallback((_) {
|
||||
if (isWalletsExists) homeClass.snackNode(ctx);
|
||||
});
|
||||
},
|
||||
|
@ -254,7 +254,7 @@ Widget geckHome(context) {
|
|||
image: AssetImage('assets/home/wallet.png'),
|
||||
height: 75)),
|
||||
onTap: () {
|
||||
WalletData defaultWallet =
|
||||
WalletData? defaultWallet =
|
||||
_myWalletProvider.getDefaultWallet(
|
||||
configBox.get('currentChest'));
|
||||
Navigator.push(
|
||||
|
@ -513,7 +513,7 @@ Widget welcomeHome(context) {
|
|||
class StatefulWrapper extends StatefulWidget {
|
||||
final Function onInit;
|
||||
final Widget child;
|
||||
const StatefulWrapper({Key key, @required this.onInit, @required this.child})
|
||||
const StatefulWrapper({Key? key, required this.onInit, required this.child})
|
||||
: super(key: key);
|
||||
@override
|
||||
_StatefulWrapperState createState() => _StatefulWrapperState();
|
||||
|
@ -522,9 +522,7 @@ class StatefulWrapper extends StatefulWidget {
|
|||
class _StatefulWrapperState extends State<StatefulWrapper> {
|
||||
@override
|
||||
void initState() {
|
||||
if (widget.onInit != null) {
|
||||
widget.onInit();
|
||||
}
|
||||
widget.onInit();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
|
@ -534,7 +532,7 @@ class _StatefulWrapperState extends State<StatefulWrapper> {
|
|||
}
|
||||
}
|
||||
|
||||
Widget bubbleSpeak(String text, {double long, Key textKey}) {
|
||||
Widget bubbleSpeak(String text, {double? long, Key? textKey}) {
|
||||
return Bubble(
|
||||
padding: long == null
|
||||
? const BubbleEdges.all(20)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:ui';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -20,7 +21,7 @@ bool _isNewNameValid = false;
|
|||
|
||||
class CesiumWalletOptions extends StatelessWidget {
|
||||
const CesiumWalletOptions(
|
||||
{Key key, Key keyMyWallets, @required this.cesiumWallet})
|
||||
{Key? key, Key? keyMyWallets, required this.cesiumWallet})
|
||||
: super(key: key);
|
||||
|
||||
final ChestData cesiumWallet;
|
||||
|
@ -40,9 +41,8 @@ class CesiumWalletOptions extends StatelessWidget {
|
|||
final String shortPubkey =
|
||||
_walletOptions.getShortPubkey(_walletOptions.pubkey.text);
|
||||
|
||||
if (_walletOptions.nameController.text == null ||
|
||||
_isNewNameValid == false) {
|
||||
_walletOptions.nameController.text = cesiumWallet.name;
|
||||
if (_isNewNameValid == false) {
|
||||
_walletOptions.nameController.text = cesiumWallet.name!;
|
||||
} else {
|
||||
cesiumWallet.name = _walletOptions.nameController.text;
|
||||
}
|
||||
|
@ -106,10 +106,8 @@ class CesiumWalletOptions extends StatelessWidget {
|
|||
const SizedBox(width: 25),
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
File newAvatar = await _walletOptions.changeAvatar();
|
||||
if (newAvatar != null) {
|
||||
File newAvatar = await (_walletOptions.changeAvatar() as FutureOr<File>);
|
||||
cesiumWallet.imageFile = newAvatar;
|
||||
}
|
||||
_walletOptions.reloadBuild();
|
||||
},
|
||||
child: cesiumWallet.imageFile == null
|
||||
|
@ -117,14 +115,12 @@ class CesiumWalletOptions extends StatelessWidget {
|
|||
'assets/chests/${cesiumWallet.imageName}',
|
||||
width: 110,
|
||||
)
|
||||
: Image.file(cesiumWallet.imageFile, width: 110),
|
||||
: Image.file(cesiumWallet.imageFile!, width: 110),
|
||||
),
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
File newAvatar = await _walletOptions.changeAvatar();
|
||||
if (newAvatar != null) {
|
||||
File newAvatar = await (_walletOptions.changeAvatar() as FutureOr<File>);
|
||||
cesiumWallet.imageFile = newAvatar;
|
||||
}
|
||||
_walletOptions.reloadBuild();
|
||||
},
|
||||
child: Column(children: <Widget>[
|
||||
|
@ -170,7 +166,7 @@ class CesiumWalletOptions extends StatelessWidget {
|
|||
// pollInterval: Duration(seconds: 1),
|
||||
),
|
||||
builder: (QueryResult result,
|
||||
{VoidCallback refetch, FetchMore fetchMore}) {
|
||||
{VoidCallback? refetch, FetchMore? fetchMore}) {
|
||||
if (result.hasException) {
|
||||
return Text(result.exception.toString());
|
||||
}
|
||||
|
@ -181,13 +177,13 @@ class CesiumWalletOptions extends StatelessWidget {
|
|||
|
||||
// List repositories = result.data['viewer']['repositories']['nodes'];
|
||||
String wBalanceUD;
|
||||
if (result.data['balance'] == null) {
|
||||
if (result.data!['balance'] == null) {
|
||||
wBalanceUD = '0.0';
|
||||
} else {
|
||||
int wBalanceG1 =
|
||||
result.data['balance']['amount'];
|
||||
result.data!['balance']['amount'];
|
||||
int currentUD =
|
||||
result.data['currentUd']['amount'];
|
||||
result.data!['currentUd']['amount'];
|
||||
double wBalanceUDBrut =
|
||||
wBalanceG1 / currentUD; // .toString();
|
||||
wBalanceUD = double.parse(
|
||||
|
@ -357,7 +353,7 @@ class CesiumWalletOptions extends StatelessWidget {
|
|||
key: const Key('changePin'),
|
||||
onTap: () async {
|
||||
// await _chestProvider.changePin(context, cesiumWallet);
|
||||
String newPin = await Navigator.push(
|
||||
String? newPin = await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) {
|
||||
|
|
|
@ -10,13 +10,13 @@ import 'package:provider/provider.dart';
|
|||
// ignore: must_be_immutable
|
||||
class ChangePinScreen extends StatelessWidget with ChangeNotifier {
|
||||
ChangePinScreen(
|
||||
{Key keyMyWallets,
|
||||
@required this.walletName,
|
||||
@required this.walletProvider})
|
||||
{Key? keyMyWallets,
|
||||
required this.walletName,
|
||||
required this.walletProvider})
|
||||
: super(key: keyMyWallets);
|
||||
final String walletName;
|
||||
final String? walletName;
|
||||
final MyWalletsProvider walletProvider;
|
||||
Directory appPath;
|
||||
Directory? appPath;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -41,7 +41,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
|
|||
}),
|
||||
title: SizedBox(
|
||||
height: 22,
|
||||
child: Text(walletName),
|
||||
child: Text(walletName!),
|
||||
),
|
||||
),
|
||||
body: Center(
|
||||
|
@ -98,7 +98,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
|
|||
onPressed: () {
|
||||
NewWallet _newWalletFile = _changePin.changePin(
|
||||
walletProvider.pinCode,
|
||||
newCustomPin: _changePin.newPin.text);
|
||||
newCustomPin: _changePin.newPin.text)!;
|
||||
_changePin.newPin.text = '';
|
||||
_changePin.storeNewPinChest(context, _newWalletFile);
|
||||
walletProvider.pinCode = _changePin.newPin.text;
|
||||
|
@ -120,7 +120,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
|
|||
class StatefulWrapper extends StatefulWidget {
|
||||
final Function onInit;
|
||||
final Widget child;
|
||||
const StatefulWrapper({Key key, @required this.onInit, @required this.child})
|
||||
const StatefulWrapper({Key? key, required this.onInit, required this.child})
|
||||
: super(key: key);
|
||||
@override
|
||||
_StatefulWrapperState createState() => _StatefulWrapperState();
|
||||
|
@ -129,9 +129,7 @@ class StatefulWrapper extends StatefulWidget {
|
|||
class _StatefulWrapperState extends State<StatefulWrapper> {
|
||||
@override
|
||||
void initState() {
|
||||
if (widget.onInit != null) {
|
||||
widget.onInit();
|
||||
}
|
||||
widget.onInit();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ import 'package:gecko/screens/myWallets/change_pin.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
|
||||
class ChestOptions extends StatelessWidget {
|
||||
const ChestOptions({Key keyMyWallets, @required this.walletProvider})
|
||||
const ChestOptions({Key? keyMyWallets, required this.walletProvider})
|
||||
: super(key: keyMyWallets);
|
||||
final MyWalletsProvider walletProvider;
|
||||
|
||||
|
@ -18,7 +18,7 @@ class ChestOptions extends StatelessWidget {
|
|||
ChestProvider _chestProvider =
|
||||
Provider.of<ChestProvider>(context, listen: false);
|
||||
|
||||
ChestData currentChest = chestBox.get(configBox.get('currentChest'));
|
||||
ChestData currentChest = chestBox.get(configBox.get('currentChest'))!;
|
||||
|
||||
return Scaffold(
|
||||
resizeToAvoidBottomInset: false,
|
||||
|
@ -34,7 +34,7 @@ class ChestOptions extends StatelessWidget {
|
|||
}),
|
||||
title: SizedBox(
|
||||
height: 22,
|
||||
child: Text(currentChest.name),
|
||||
child: Text(currentChest.name!),
|
||||
)),
|
||||
body: Builder(
|
||||
builder: (ctx) => SafeArea(
|
||||
|
@ -44,7 +44,7 @@ class ChestOptions extends StatelessWidget {
|
|||
key: const Key('changePin'),
|
||||
onTap: () async {
|
||||
// await _chestProvider.changePin(context, cesiumWallet);
|
||||
String pinResult = await Navigator.push(
|
||||
String? pinResult = await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) {
|
||||
|
|
|
@ -9,8 +9,8 @@ import 'package:carousel_slider/carousel_slider.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
|
||||
class ChooseChest extends StatefulWidget {
|
||||
const ChooseChest({this.action, Key key}) : super(key: key);
|
||||
final String action;
|
||||
const ChooseChest({this.action, Key? key}) : super(key: key);
|
||||
final String? action;
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() {
|
||||
|
@ -22,7 +22,7 @@ class ChooseChest extends StatefulWidget {
|
|||
class _ChooseChestState extends State<ChooseChest> {
|
||||
TextEditingController tplController = TextEditingController();
|
||||
CarouselController buttonCarouselController = CarouselController();
|
||||
int currentChest = configBox.get('currentChest');
|
||||
int? currentChest = configBox.get('currentChest');
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -51,7 +51,7 @@ class _ChooseChestState extends State<ChooseChest> {
|
|||
setState(() {});
|
||||
},
|
||||
enableInfiniteScroll: false,
|
||||
initialPage: currentChest,
|
||||
initialPage: currentChest!,
|
||||
enlargeCenterPage: true,
|
||||
viewportFraction: 0.6,
|
||||
),
|
||||
|
@ -65,12 +65,12 @@ class _ChooseChestState extends State<ChooseChest> {
|
|||
height: 150,
|
||||
)
|
||||
: Image.file(
|
||||
i.value.imageFile,
|
||||
i.value.imageFile!,
|
||||
height: 150,
|
||||
),
|
||||
const SizedBox(height: 30),
|
||||
Text(
|
||||
i.value.name,
|
||||
i.value.name!,
|
||||
style: const TextStyle(fontSize: 21),
|
||||
),
|
||||
]);
|
||||
|
@ -113,7 +113,7 @@ class _ChooseChestState extends State<ChooseChest> {
|
|||
),
|
||||
onPressed: () {
|
||||
configBox.put('currentChest', currentChest);
|
||||
WalletData defaultWallet =
|
||||
WalletData? defaultWallet =
|
||||
_myWalletProvider.getDefaultWallet(currentChest);
|
||||
_myWalletProvider.rebuildWidget();
|
||||
Navigator.pushAndRemoveUntil(
|
||||
|
|
|
@ -11,13 +11,13 @@ import 'package:provider/provider.dart';
|
|||
// ignore: must_be_immutable
|
||||
class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
|
||||
ConfirmStoreWallet({
|
||||
Key validationKey,
|
||||
@required this.generatedMnemonic,
|
||||
@required this.generatedWallet,
|
||||
Key? validationKey,
|
||||
required this.generatedMnemonic,
|
||||
required this.generatedWallet,
|
||||
}) : super(key: validationKey);
|
||||
|
||||
String generatedMnemonic;
|
||||
NewWallet generatedWallet;
|
||||
String? generatedMnemonic;
|
||||
NewWallet? generatedWallet;
|
||||
|
||||
final TextEditingController _mnemonicController = TextEditingController();
|
||||
final TextEditingController _inputRestoreWord = TextEditingController();
|
||||
|
@ -31,9 +31,9 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
|
|||
Provider.of<GenerateWalletsProvider>(context);
|
||||
MyWalletsProvider _myWalletProvider =
|
||||
Provider.of<MyWalletsProvider>(context);
|
||||
final int _currentChest = _myWalletProvider.getCurrentChest();
|
||||
final int? _currentChest = _myWalletProvider.getCurrentChest();
|
||||
|
||||
_mnemonicController.text = generatedMnemonic;
|
||||
_mnemonicController.text = generatedMnemonic!;
|
||||
return WillPopScope(
|
||||
onWillPop: () {
|
||||
_generateWalletProvider.isAskedWordValid = false;
|
||||
|
@ -135,7 +135,7 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
|
|||
walletName.text != '')
|
||||
? () async {
|
||||
_generateWalletProvider.storeHDWChest(
|
||||
generatedWallet,
|
||||
generatedWallet!,
|
||||
walletName.text,
|
||||
context);
|
||||
_generateWalletProvider.isAskedWordValid =
|
||||
|
|
|
@ -10,7 +10,7 @@ import 'package:super_tooltip/super_tooltip.dart';
|
|||
|
||||
// ignore: must_be_immutable
|
||||
class GenerateFastChestScreen extends StatelessWidget {
|
||||
SuperTooltip tooltip;
|
||||
SuperTooltip? tooltip;
|
||||
bool hasError = false;
|
||||
String validPin = 'NO PIN';
|
||||
String currentText = "";
|
||||
|
@ -19,7 +19,7 @@ class GenerateFastChestScreen extends StatelessWidget {
|
|||
final GlobalKey _toolTipSentence = GlobalKey();
|
||||
final GlobalKey _toolTipSecret = GlobalKey();
|
||||
|
||||
GenerateFastChestScreen({Key key}) : super(key: key);
|
||||
GenerateFastChestScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -30,7 +30,7 @@ class GenerateFastChestScreen extends StatelessWidget {
|
|||
if (_generateWalletProvider.mnemonicController.text == '') {
|
||||
_generateWalletProvider.generateWordList();
|
||||
_generateWalletProvider.mnemonicController.text =
|
||||
_generateWalletProvider.generatedMnemonic;
|
||||
_generateWalletProvider.generatedMnemonic!;
|
||||
_generateWalletProvider.pin.text = randomSecretCode(5);
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ class GenerateFastChestScreen extends StatelessWidget {
|
|||
onPressed: () {
|
||||
_generateWalletProvider.generateWordList();
|
||||
_generateWalletProvider.mnemonicController.text =
|
||||
_generateWalletProvider.generatedMnemonic;
|
||||
_generateWalletProvider.generatedMnemonic!;
|
||||
},
|
||||
child: SizedBox(
|
||||
height: 40.0,
|
||||
|
@ -118,7 +118,7 @@ class GenerateFastChestScreen extends StatelessWidget {
|
|||
_generateWalletProvider.actualWallet = Dewif()
|
||||
.generateDewif(
|
||||
_generateWalletProvider
|
||||
.generatedMnemonic,
|
||||
.generatedMnemonic!,
|
||||
_generateWalletProvider.pin.text,
|
||||
lang: 'french');
|
||||
await Navigator.push(
|
||||
|
@ -189,9 +189,9 @@ class GenerateFastChestScreen extends StatelessWidget {
|
|||
|
||||
// ignore: must_be_immutable
|
||||
class PrintWallet extends StatelessWidget {
|
||||
const PrintWallet(this.sentence, {Key key}) : super(key: key);
|
||||
const PrintWallet(this.sentence, {Key? key}) : super(key: key);
|
||||
|
||||
final String sentence;
|
||||
final String? sentence;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -11,13 +11,13 @@ import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
|
||||
class ImportWalletScreen extends StatelessWidget {
|
||||
const ImportWalletScreen({Key key}) : super(key: key);
|
||||
const ImportWalletScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
|
||||
GlobalKey _toolTipSecret = GlobalKey();
|
||||
Timer _debounce;
|
||||
Timer? _debounce;
|
||||
GenerateWalletsProvider _generateWalletProvider =
|
||||
Provider.of<GenerateWalletsProvider>(context, listen: false);
|
||||
WalletOptionsProvider _walletOptions =
|
||||
|
@ -54,7 +54,7 @@ class ImportWalletScreen extends StatelessWidget {
|
|||
autofocus: true,
|
||||
onChanged: (text) {
|
||||
if (_debounce?.isActive ?? false) {
|
||||
_debounce.cancel();
|
||||
_debounce!.cancel();
|
||||
}
|
||||
_debounce = Timer(const Duration(milliseconds: 600), () {
|
||||
walletProvider
|
||||
|
@ -92,7 +92,7 @@ class ImportWalletScreen extends StatelessWidget {
|
|||
return TextFormField(
|
||||
onChanged: (text) {
|
||||
if (_debounce?.isActive ?? false) {
|
||||
_debounce.cancel();
|
||||
_debounce!.cancel();
|
||||
}
|
||||
_debounce = Timer(const Duration(milliseconds: 600), () {
|
||||
walletProvider
|
||||
|
|
|
@ -10,7 +10,7 @@ import 'package:provider/provider.dart';
|
|||
// import 'package:provider/provider.dart';
|
||||
|
||||
class RestoreChest extends StatelessWidget {
|
||||
const RestoreChest({Key key}) : super(key: key);
|
||||
const RestoreChest({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -160,7 +160,7 @@ class RestoreChest extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
|
||||
Future<bool> badMnemonicPopup(BuildContext context) async {
|
||||
Future<bool?> badMnemonicPopup(BuildContext context) async {
|
||||
return showDialog<bool>(
|
||||
context: context,
|
||||
barrierDismissible: true, // user must tap button!
|
||||
|
|
|
@ -15,17 +15,17 @@ import 'package:gecko/globals.dart';
|
|||
// ignore: must_be_immutable
|
||||
class UnlockingWallet extends StatelessWidget {
|
||||
UnlockingWallet(
|
||||
{Key keyUnlockWallet, @required this.wallet, @required this.action})
|
||||
{Key? keyUnlockWallet, required this.wallet, required this.action})
|
||||
: super(key: keyUnlockWallet);
|
||||
WalletData wallet;
|
||||
WalletData? wallet;
|
||||
String action;
|
||||
|
||||
// ignore: close_sinks
|
||||
StreamController<ErrorAnimationType> errorController;
|
||||
StreamController<ErrorAnimationType>? errorController;
|
||||
final formKey = GlobalKey<FormState>();
|
||||
var pinColor = const Color(0xffF9F9F1);
|
||||
Color? pinColor = const Color(0xffF9F9F1);
|
||||
var walletPin = '';
|
||||
String resultPay;
|
||||
String? resultPay;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -35,13 +35,13 @@ class UnlockingWallet extends StatelessWidget {
|
|||
final double statusBarHeight = MediaQuery.of(context).padding.top;
|
||||
|
||||
int _pinLenght;
|
||||
ChestData currentChest = chestBox.get(configBox.get('currentChest'));
|
||||
ChestData currentChest = chestBox.get(configBox.get('currentChest'))!;
|
||||
|
||||
if (currentChest.isCesium) {
|
||||
if (currentChest.isCesium!) {
|
||||
_pinLenght = _walletOptions.getPinLenght(currentChest.dewif);
|
||||
wallet = WalletData(derivation: -1, chest: currentChest.key);
|
||||
} else {
|
||||
_pinLenght = _walletOptions.getPinLenght(wallet.number);
|
||||
_pinLenght = _walletOptions.getPinLenght(wallet!.number);
|
||||
}
|
||||
errorController = StreamController<ErrorAnimationType>();
|
||||
|
||||
|
@ -77,14 +77,14 @@ class UnlockingWallet extends StatelessWidget {
|
|||
width: isTall ? 130 : 100,
|
||||
)
|
||||
: Image.file(
|
||||
currentChest.imageFile,
|
||||
currentChest.imageFile!,
|
||||
width: isTall ? 130 : 100,
|
||||
),
|
||||
const SizedBox(width: 5),
|
||||
SizedBox(
|
||||
width: 250,
|
||||
child: Text(
|
||||
currentChest.name,
|
||||
currentChest.name!,
|
||||
textAlign: TextAlign.center,
|
||||
style: const TextStyle(
|
||||
fontSize: 25,
|
||||
|
@ -165,7 +165,7 @@ class UnlockingWallet extends StatelessWidget {
|
|||
obscuringCharacter: '*',
|
||||
animationType: AnimationType.fade,
|
||||
validator: (v) {
|
||||
if (v.length < _pinLenght) {
|
||||
if (v!.length < _pinLenght) {
|
||||
return "Votre code PIN fait $_pinLenght caractères";
|
||||
} else {
|
||||
return null;
|
||||
|
@ -198,8 +198,8 @@ class UnlockingWallet extends StatelessWidget {
|
|||
onCompleted: (_pin) async {
|
||||
log.d("Completed");
|
||||
_myWalletProvider.pinCode = _pin;
|
||||
final String resultWallet = _walletOptions.readLocalWallet(
|
||||
context, wallet, _pin.toUpperCase(), _pinLenght);
|
||||
final String? resultWallet = _walletOptions.readLocalWallet(
|
||||
context, wallet!, _pin.toUpperCase(), _pinLenght);
|
||||
// _myWalletProvider.pinCode = _pin.toUpperCase();
|
||||
_myWalletProvider.pinLenght = _pinLenght;
|
||||
|
||||
|
@ -213,7 +213,7 @@ class UnlockingWallet extends StatelessWidget {
|
|||
pinColor = Colors.green[400];
|
||||
// await Future.delayed(Duration(milliseconds: 50));
|
||||
if (action == "mywallets") {
|
||||
currentChest.isCesium
|
||||
currentChest.isCesium!
|
||||
? Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) {
|
||||
|
@ -222,7 +222,7 @@ class UnlockingWallet extends StatelessWidget {
|
|||
}),
|
||||
)
|
||||
: Navigator.pushNamed(
|
||||
formKey.currentContext, '/mywallets');
|
||||
formKey.currentContext!, '/mywallets');
|
||||
} else if (action == "pay") {
|
||||
resultPay =
|
||||
await _historyProvider.pay(context, _pin.toUpperCase());
|
||||
|
@ -239,7 +239,7 @@ class UnlockingWallet extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
|
||||
Future<bool> _paymentsResult(context) {
|
||||
Future<bool?> _paymentsResult(context) {
|
||||
if (resultPay != "success") log.i(resultPay);
|
||||
return showDialog<bool>(
|
||||
context: context,
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:ui';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -15,7 +16,7 @@ import 'package:qr_flutter/qr_flutter.dart';
|
|||
|
||||
// ignore: must_be_immutable
|
||||
class WalletOptions extends StatelessWidget {
|
||||
WalletOptions({Key keyMyWallets, @required this.wallet})
|
||||
WalletOptions({Key? keyMyWallets, required this.wallet})
|
||||
: super(key: keyMyWallets);
|
||||
WalletData wallet;
|
||||
int _nbrLinesName = 1;
|
||||
|
@ -33,13 +34,12 @@ class WalletOptions extends StatelessWidget {
|
|||
|
||||
log.d(_walletOptions.pubkey.text);
|
||||
|
||||
final int _currentChest = _myWalletProvider.getCurrentChest();
|
||||
final int? _currentChest = _myWalletProvider.getCurrentChest();
|
||||
final String shortPubkey =
|
||||
_walletOptions.getShortPubkey(_walletOptions.pubkey.text);
|
||||
|
||||
if (_walletOptions.nameController.text == null ||
|
||||
_isNewNameValid == false) {
|
||||
_walletOptions.nameController.text = wallet.name;
|
||||
if (_isNewNameValid == false) {
|
||||
_walletOptions.nameController.text = wallet.name!;
|
||||
} else {
|
||||
wallet.name = _walletOptions.nameController.text;
|
||||
}
|
||||
|
@ -52,11 +52,11 @@ class WalletOptions extends StatelessWidget {
|
|||
}
|
||||
|
||||
WalletData defaultWallet =
|
||||
_myWalletProvider.getDefaultWallet(_currentChest);
|
||||
_myWalletProvider.getDefaultWallet(_currentChest)!;
|
||||
|
||||
_walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id()[1]);
|
||||
|
||||
int currentChest = _myWalletProvider.getCurrentChest();
|
||||
int? currentChest = _myWalletProvider.getCurrentChest();
|
||||
|
||||
log.d("Wallet options: $currentChest:${wallet.number}");
|
||||
|
||||
|
@ -116,10 +116,8 @@ class WalletOptions extends StatelessWidget {
|
|||
const SizedBox(width: 25),
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
File newAvatar = await walletProvider.changeAvatar();
|
||||
if (newAvatar != null) {
|
||||
File newAvatar = await (walletProvider.changeAvatar() as FutureOr<File>);
|
||||
wallet.imageFile = newAvatar;
|
||||
}
|
||||
walletProvider.reloadBuild();
|
||||
},
|
||||
child: wallet.imageFile == null
|
||||
|
@ -128,16 +126,14 @@ class WalletOptions extends StatelessWidget {
|
|||
width: 110,
|
||||
)
|
||||
: Image.file(
|
||||
wallet.imageFile,
|
||||
wallet.imageFile!,
|
||||
width: 110,
|
||||
),
|
||||
),
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
File newAvatar = await walletProvider.changeAvatar();
|
||||
if (newAvatar != null) {
|
||||
File newAvatar = await (walletProvider.changeAvatar() as FutureOr<File>);
|
||||
wallet.imageFile = newAvatar;
|
||||
}
|
||||
walletProvider.reloadBuild();
|
||||
},
|
||||
child: Column(children: <Widget>[
|
||||
|
@ -183,7 +179,7 @@ class WalletOptions extends StatelessWidget {
|
|||
// pollInterval: Duration(seconds: 1),
|
||||
),
|
||||
builder: (QueryResult result,
|
||||
{VoidCallback refetch, FetchMore fetchMore}) {
|
||||
{VoidCallback? refetch, FetchMore? fetchMore}) {
|
||||
if (result.hasException) {
|
||||
return Text(result.exception.toString());
|
||||
}
|
||||
|
@ -194,15 +190,15 @@ class WalletOptions extends StatelessWidget {
|
|||
|
||||
// List repositories = result.data['viewer']['repositories']['nodes'];
|
||||
String wBalanceUD;
|
||||
if (result.data['balance'] == null) {
|
||||
if (result.data!['balance'] == null) {
|
||||
wBalanceUD = '0.0';
|
||||
} else if (result.hasException) {
|
||||
wBalanceUD = '?';
|
||||
} else {
|
||||
int wBalanceG1 =
|
||||
result.data['balance']['amount'];
|
||||
result.data!['balance']['amount'];
|
||||
int currentUD =
|
||||
result.data['currentUd']['amount'];
|
||||
result.data!['currentUd']['amount'];
|
||||
double wBalanceUDBrut =
|
||||
wBalanceG1 / currentUD; // .toString();
|
||||
wBalanceUD = double.parse(
|
||||
|
@ -366,7 +362,7 @@ class WalletOptions extends StatelessWidget {
|
|||
width: 110,
|
||||
)
|
||||
: Image.file(
|
||||
wallet.imageFile,
|
||||
wallet.imageFile!,
|
||||
width: 110,
|
||||
));
|
||||
}),
|
||||
|
@ -393,7 +389,7 @@ class WalletOptions extends StatelessWidget {
|
|||
onTap: !walletProvider.isDefaultWallet
|
||||
? () {
|
||||
defaultWallet = wallet;
|
||||
chestBox.get(currentChest).defaultWallet =
|
||||
chestBox.get(currentChest)!.defaultWallet =
|
||||
wallet.number;
|
||||
_myWalletProvider.readAllWallets(_currentChest);
|
||||
_myWalletProvider.rebuildWidget();
|
||||
|
@ -432,7 +428,7 @@ class WalletOptions extends StatelessWidget {
|
|||
? () async {
|
||||
await walletProvider.deleteWallet(
|
||||
context, wallet);
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
WidgetsBinding.instance!.addPostFrameCallback((_) {
|
||||
_myWalletProvider.listWallets =
|
||||
_myWalletProvider
|
||||
.readAllWallets(_currentChest);
|
||||
|
|
|
@ -13,7 +13,7 @@ import 'package:graphql_flutter/graphql_flutter.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
|
||||
class WalletsHome extends StatelessWidget {
|
||||
const WalletsHome({Key key}) : super(key: key);
|
||||
const WalletsHome({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -21,8 +21,8 @@ class WalletsHome extends StatelessWidget {
|
|||
MyWalletsProvider myWalletProvider =
|
||||
Provider.of<MyWalletsProvider>(context);
|
||||
|
||||
final int _currentChestNumber = myWalletProvider.getCurrentChest();
|
||||
final ChestData _currentChest = chestBox.get(_currentChestNumber);
|
||||
final int? _currentChestNumber = myWalletProvider.getCurrentChest();
|
||||
final ChestData _currentChest = chestBox.get(_currentChestNumber)!;
|
||||
myWalletProvider.listWallets =
|
||||
myWalletProvider.readAllWallets(_currentChestNumber);
|
||||
|
||||
|
@ -45,7 +45,7 @@ class WalletsHome extends StatelessWidget {
|
|||
ModalRoute.withName('/'),
|
||||
);
|
||||
}),
|
||||
title: Text(_currentChest.name,
|
||||
title: Text(_currentChest.name!,
|
||||
key: const Key('myWallets'),
|
||||
style: TextStyle(color: Colors.grey[850])),
|
||||
backgroundColor: const Color(0xffFFD58D),
|
||||
|
@ -146,7 +146,7 @@ class WalletsHome extends StatelessWidget {
|
|||
}
|
||||
|
||||
List _listWallets = _myWalletProvider.listWallets;
|
||||
WalletData defaultWallet =
|
||||
WalletData? defaultWallet =
|
||||
_myWalletProvider.getDefaultWallet(configBox.get('currentChest'));
|
||||
|
||||
return CustomScrollView(slivers: <Widget>[
|
||||
|
@ -158,7 +158,7 @@ class WalletsHome extends StatelessWidget {
|
|||
crossAxisSpacing: 0,
|
||||
mainAxisSpacing: 0,
|
||||
children: <Widget>[
|
||||
for (WalletData _repository in _listWallets)
|
||||
for (WalletData _repository in _listWallets as Iterable<WalletData>)
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: GestureDetector(
|
||||
|
@ -196,7 +196,7 @@ class WalletsHome extends StatelessWidget {
|
|||
gradient: RadialGradient(
|
||||
radius: 0.6,
|
||||
colors: [
|
||||
Colors.green[400],
|
||||
Colors.green[400]!,
|
||||
const Color(0xFFE7E7A6),
|
||||
],
|
||||
)),
|
||||
|
@ -210,7 +210,7 @@ class WalletsHome extends StatelessWidget {
|
|||
scale: 0.5,
|
||||
)
|
||||
: Image.file(
|
||||
_repository.imageFile,
|
||||
_repository.imageFile!,
|
||||
alignment: Alignment.bottomCenter,
|
||||
scale: 0.5,
|
||||
),
|
||||
|
@ -222,7 +222,7 @@ class WalletsHome extends StatelessWidget {
|
|||
bottom: Radius.circular(12))),
|
||||
// contentPadding: const EdgeInsets.only(left: 7.0),
|
||||
tileColor:
|
||||
_repository.id()[1] == defaultWallet.id()[1]
|
||||
_repository.id()[1] == defaultWallet!.id()[1]
|
||||
? orangeC
|
||||
: const Color(0xffFFD58D),
|
||||
// leading: Text('IMAGE'),
|
||||
|
@ -234,7 +234,7 @@ class WalletsHome extends StatelessWidget {
|
|||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 5),
|
||||
child: Text(
|
||||
_repository.name,
|
||||
_repository.name!,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 17.0,
|
||||
|
@ -287,7 +287,7 @@ class WalletsHome extends StatelessWidget {
|
|||
// pollInterval: Duration(seconds: 1),
|
||||
),
|
||||
builder: (QueryResult result,
|
||||
{VoidCallback refetch, FetchMore fetchMore}) {
|
||||
{VoidCallback? refetch, FetchMore? fetchMore}) {
|
||||
if (result.hasException) {
|
||||
return Text(result.exception.toString());
|
||||
}
|
||||
|
@ -296,11 +296,11 @@ class WalletsHome extends StatelessWidget {
|
|||
return const Text('Loading');
|
||||
}
|
||||
String wBalanceUD;
|
||||
if (result.data['balance'] == null) {
|
||||
if (result.data!['balance'] == null) {
|
||||
wBalanceUD = '0.0';
|
||||
} else {
|
||||
int wBalanceG1 = result.data['balance']['amount'];
|
||||
int currentUD = result.data['currentUd']['amount'];
|
||||
int wBalanceG1 = result.data!['balance']['amount'];
|
||||
int currentUD = result.data!['currentUd']['amount'];
|
||||
double wBalanceUDBrut = wBalanceG1 / currentUD; // .toString();
|
||||
wBalanceUD =
|
||||
double.parse((wBalanceUDBrut).toStringAsFixed(2)).toString();
|
||||
|
@ -314,7 +314,7 @@ class WalletsHome extends StatelessWidget {
|
|||
Provider.of<MyWalletsProvider>(context);
|
||||
|
||||
String _newDerivationName =
|
||||
'Portefeuille ${_myWalletProvider.listWallets.last.number + 2}';
|
||||
'Portefeuille ${_myWalletProvider.listWallets.last.number! + 2}';
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: ClipRRect(
|
||||
|
@ -371,10 +371,10 @@ class ClipOvalShadow extends StatelessWidget {
|
|||
final Widget child;
|
||||
|
||||
const ClipOvalShadow({
|
||||
Key key,
|
||||
@required this.shadow,
|
||||
@required this.clipper,
|
||||
@required this.child,
|
||||
Key? key,
|
||||
required this.shadow,
|
||||
required this.clipper,
|
||||
required this.child,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
|
@ -393,7 +393,7 @@ class _ClipOvalShadowPainter extends CustomPainter {
|
|||
final Shadow shadow;
|
||||
final CustomClipper<Rect> clipper;
|
||||
|
||||
_ClipOvalShadowPainter({@required this.shadow, @required this.clipper});
|
||||
_ClipOvalShadowPainter({required this.shadow, required this.clipper});
|
||||
|
||||
@override
|
||||
void paint(Canvas canvas, Size size) {
|
||||
|
|
|
@ -8,7 +8,7 @@ import 'package:gecko/screens/myWallets/import_cesium_wallet.dart';
|
|||
import 'package:gecko/screens/onBoarding/1.dart';
|
||||
|
||||
class NoKeyChainScreen extends StatelessWidget {
|
||||
const NoKeyChainScreen({Key key}) : super(key: key);
|
||||
const NoKeyChainScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -13,7 +13,7 @@ class OnboardingStepOne extends StatelessWidget {
|
|||
TextEditingController tplController = TextEditingController();
|
||||
final int progress = 1;
|
||||
|
||||
OnboardingStepOne({Key key}) : super(key: key);
|
||||
OnboardingStepOne({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -11,7 +11,7 @@ class OnboardingStepTwelve extends StatelessWidget {
|
|||
TextEditingController tplController = TextEditingController();
|
||||
final int progress = 9;
|
||||
|
||||
OnboardingStepTwelve({Key key}) : super(key: key);
|
||||
OnboardingStepTwelve({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -11,7 +11,7 @@ import 'package:provider/provider.dart';
|
|||
class OnboardingStepThirteen extends StatelessWidget {
|
||||
final int progress = 10;
|
||||
|
||||
const OnboardingStepThirteen({Key key}) : super(key: key);
|
||||
const OnboardingStepThirteen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -16,12 +16,12 @@ import 'package:provider/provider.dart';
|
|||
// ignore: must_be_immutable
|
||||
class OnboardingStepFourteen extends StatelessWidget {
|
||||
OnboardingStepFourteen({
|
||||
Key validationKey,
|
||||
Key? validationKey,
|
||||
}) : super(key: validationKey);
|
||||
|
||||
final int progress = 11;
|
||||
final formKey = GlobalKey<FormState>();
|
||||
var pinColor = const Color(0xFFA4B600);
|
||||
Color? pinColor = const Color(0xFFA4B600);
|
||||
bool hasError = false;
|
||||
|
||||
@override
|
||||
|
@ -62,7 +62,7 @@ class OnboardingStepFourteen extends StatelessWidget {
|
|||
GenerateWalletsProvider _generateWalletProvider =
|
||||
Provider.of<GenerateWalletsProvider>(context);
|
||||
|
||||
final int _currentChest = _myWalletProvider.getCurrentChest();
|
||||
final int? _currentChest = _myWalletProvider.getCurrentChest();
|
||||
|
||||
return Form(
|
||||
key: formKey,
|
||||
|
@ -81,7 +81,7 @@ class OnboardingStepFourteen extends StatelessWidget {
|
|||
obscuringCharacter: '*',
|
||||
animationType: AnimationType.fade,
|
||||
validator: (v) {
|
||||
if (v.length < _pinLenght) {
|
||||
if (v!.length < _pinLenght) {
|
||||
return "Votre code PIN fait $_pinLenght caractères";
|
||||
} else {
|
||||
return null;
|
||||
|
@ -118,7 +118,7 @@ class OnboardingStepFourteen extends StatelessWidget {
|
|||
if (_pin.toUpperCase() == _generateWalletProvider.pin.text) {
|
||||
pinColor = Colors.green[500];
|
||||
NewWallet generatedWallet = Dewif().generateDewif(
|
||||
_generateWalletProvider.generatedMnemonic,
|
||||
_generateWalletProvider.generatedMnemonic!,
|
||||
_generateWalletProvider.pin.text,
|
||||
lang: 'french');
|
||||
_generateWalletProvider.storeHDWChest(
|
||||
|
|
|
@ -10,7 +10,7 @@ class OnboardingStepFiveteen extends StatelessWidget {
|
|||
TextEditingController tplController = TextEditingController();
|
||||
final int progress = 12;
|
||||
|
||||
OnboardingStepFiveteen({Key key}) : super(key: key);
|
||||
OnboardingStepFiveteen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -14,7 +14,7 @@ class OnboardingStepTwo extends StatelessWidget {
|
|||
TextEditingController tplController = TextEditingController();
|
||||
final int progress = 2;
|
||||
|
||||
OnboardingStepTwo({Key key}) : super(key: key);
|
||||
OnboardingStepTwo({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -11,7 +11,7 @@ class OnboardingStepFor extends StatelessWidget {
|
|||
TextEditingController tplController = TextEditingController();
|
||||
final int progress = 3;
|
||||
|
||||
OnboardingStepFor({Key key}) : super(key: key);
|
||||
OnboardingStepFor({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -11,7 +11,7 @@ class OnboardingStepFive extends StatelessWidget {
|
|||
TextEditingController tplController = TextEditingController();
|
||||
final int progress = 4;
|
||||
|
||||
OnboardingStepFive({Key key}) : super(key: key);
|
||||
OnboardingStepFive({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -11,7 +11,7 @@ class OnboardingStepSeven extends StatelessWidget {
|
|||
TextEditingController tplController = TextEditingController();
|
||||
final int progress = 5;
|
||||
|
||||
OnboardingStepSeven({Key key}) : super(key: key);
|
||||
OnboardingStepSeven({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -12,7 +12,7 @@ class OnboardingStepEight extends StatelessWidget {
|
|||
TextEditingController tplController = TextEditingController();
|
||||
final int progress = 6;
|
||||
|
||||
OnboardingStepEight({Key key}) : super(key: key);
|
||||
OnboardingStepEight({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -14,7 +14,7 @@ class OnboardingStepNine extends StatelessWidget {
|
|||
TextEditingController tplController = TextEditingController();
|
||||
final int progress = 6;
|
||||
|
||||
OnboardingStepNine({Key key}) : super(key: key);
|
||||
OnboardingStepNine({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -176,9 +176,9 @@ Widget arrayCell(dataWord) {
|
|||
|
||||
// ignore: must_be_immutable
|
||||
class PrintWallet extends StatelessWidget {
|
||||
const PrintWallet(this.sentence, {Key key}) : super(key: key);
|
||||
const PrintWallet(this.sentence, {Key? key}) : super(key: key);
|
||||
|
||||
final String sentence;
|
||||
final String? sentence;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -10,11 +10,11 @@ import 'package:provider/provider.dart';
|
|||
// ignore: must_be_immutable
|
||||
class OnboardingStepTen extends StatelessWidget {
|
||||
OnboardingStepTen({
|
||||
Key validationKey,
|
||||
@required this.generatedMnemonic,
|
||||
Key? validationKey,
|
||||
required this.generatedMnemonic,
|
||||
}) : super(key: validationKey);
|
||||
|
||||
String generatedMnemonic;
|
||||
String? generatedMnemonic;
|
||||
TextEditingController tplController = TextEditingController();
|
||||
TextEditingController wordController = TextEditingController();
|
||||
final TextEditingController _mnemonicController = TextEditingController();
|
||||
|
@ -27,7 +27,7 @@ class OnboardingStepTen extends StatelessWidget {
|
|||
GenerateWalletsProvider _generateWalletProvider =
|
||||
Provider.of<GenerateWalletsProvider>(context);
|
||||
CommonElements common = CommonElements();
|
||||
_mnemonicController.text = generatedMnemonic;
|
||||
_mnemonicController.text = generatedMnemonic!;
|
||||
|
||||
return WillPopScope(
|
||||
onWillPop: () {
|
||||
|
@ -70,7 +70,7 @@ class OnboardingStepTen extends StatelessWidget {
|
|||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(7),
|
||||
border: Border.all(
|
||||
color: Colors.grey[600],
|
||||
color: Colors.grey[600]!,
|
||||
width: 3,
|
||||
)),
|
||||
width: 430,
|
||||
|
|
|
@ -11,7 +11,7 @@ class OnboardingStepEleven extends StatelessWidget {
|
|||
TextEditingController tplController = TextEditingController();
|
||||
final int progress = 8;
|
||||
|
||||
OnboardingStepEleven({Key key}) : super(key: key);
|
||||
OnboardingStepEleven({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -8,7 +8,7 @@ import 'package:provider/provider.dart';
|
|||
// import 'package:provider/provider.dart';
|
||||
|
||||
class SearchScreen extends StatelessWidget {
|
||||
const SearchScreen({Key key}) : super(key: key);
|
||||
const SearchScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -59,11 +59,11 @@ class SearchScreen extends StatelessWidget {
|
|||
),
|
||||
border: OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(color: Colors.grey[500], width: 2),
|
||||
BorderSide(color: Colors.grey[500]!, width: 2),
|
||||
borderRadius: BorderRadius.circular(8)),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(color: Colors.grey[500], width: 2.5),
|
||||
BorderSide(color: Colors.grey[500]!, width: 2.5),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
contentPadding: const EdgeInsets.all(20),
|
||||
|
|
|
@ -9,7 +9,7 @@ import 'package:gecko/screens/wallet_view.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
|
||||
class SearchResultScreen extends StatelessWidget {
|
||||
const SearchResultScreen({Key key}) : super(key: key);
|
||||
const SearchResultScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -64,11 +64,11 @@ class SearchResultScreen extends StatelessWidget {
|
|||
const SizedBox(height: 20),
|
||||
FutureBuilder(
|
||||
future: _searchProvider.searchBlockchain(),
|
||||
builder: (context, snapshot) {
|
||||
builder: (context, AsyncSnapshot<List?> snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.done) {
|
||||
return Expanded(
|
||||
child: ListView(children: <Widget>[
|
||||
for (G1WalletsList g1Wallet in snapshot.data)
|
||||
for (G1WalletsList g1Wallet in snapshot.data ?? [])
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 5),
|
||||
child: ListTile(
|
||||
|
@ -81,13 +81,13 @@ class SearchResultScreen extends StatelessWidget {
|
|||
null
|
||||
? ClipOval(
|
||||
child: g1WalletsBox
|
||||
.get(g1Wallet.pubkey)
|
||||
.get(g1Wallet.pubkey)!
|
||||
.avatar)
|
||||
: FutureBuilder(
|
||||
future: _cesiumPlusProvider.getAvatar(
|
||||
g1Wallet.pubkey, _avatarSize),
|
||||
builder: (BuildContext context,
|
||||
AsyncSnapshot<Image> _avatar) {
|
||||
AsyncSnapshot<Image?> _avatar) {
|
||||
if (_avatar.connectionState !=
|
||||
ConnectionState.done ||
|
||||
_avatar.hasError) {
|
||||
|
@ -108,12 +108,12 @@ class SearchResultScreen extends StatelessWidget {
|
|||
}
|
||||
if (_avatar.hasData) {
|
||||
g1WalletsBox
|
||||
.get(g1Wallet.pubkey)
|
||||
.get(g1Wallet.pubkey)!
|
||||
.avatar = _avatar.data;
|
||||
return ClipOval(child: _avatar.data);
|
||||
} else {
|
||||
g1WalletsBox
|
||||
.get(g1Wallet.pubkey)
|
||||
.get(g1Wallet.pubkey)!
|
||||
.avatar =
|
||||
_cesiumPlusProvider
|
||||
.defaultAvatar(_avatarSize);
|
||||
|
@ -124,7 +124,7 @@ class SearchResultScreen extends StatelessWidget {
|
|||
title: Row(children: <Widget>[
|
||||
Text(
|
||||
_walletsProfilesClass
|
||||
.getShortPubkey(g1Wallet.pubkey),
|
||||
.getShortPubkey(g1Wallet.pubkey!),
|
||||
style: const TextStyle(
|
||||
fontSize: 18,
|
||||
fontFamily: 'Monospace',
|
||||
|
@ -132,7 +132,7 @@ class SearchResultScreen extends StatelessWidget {
|
|||
textAlign: TextAlign.center),
|
||||
]),
|
||||
subtitle: Row(children: <Widget>[
|
||||
Text(g1Wallet?.id?.username ?? '',
|
||||
Text(g1Wallet.id?.username ?? '',
|
||||
style: const TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w500),
|
||||
|
|
|
@ -9,20 +9,20 @@ import 'package:gecko/globals.dart';
|
|||
|
||||
// ignore: must_be_immutable
|
||||
class SettingsScreen extends StatelessWidget {
|
||||
String generatedMnemonic;
|
||||
String? generatedMnemonic;
|
||||
bool walletIsGenerated = false;
|
||||
NewWallet actualWallet;
|
||||
String newWalletName;
|
||||
NewWallet? actualWallet;
|
||||
String? newWalletName;
|
||||
|
||||
bool hasError = false;
|
||||
String validPin = 'NO PIN';
|
||||
String currentText = "";
|
||||
var pinColor = Colors.grey[300];
|
||||
Directory appPath;
|
||||
Directory? appPath;
|
||||
|
||||
final MyWalletsProvider _myWallets = MyWalletsProvider();
|
||||
|
||||
SettingsScreen({Key key}) : super(key: key);
|
||||
SettingsScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -8,7 +8,7 @@ import 'package:flutter/material.dart';
|
|||
class TemplateScreen extends StatelessWidget {
|
||||
TextEditingController tplController = TextEditingController();
|
||||
|
||||
TemplateScreen({Key key}) : super(key: key);
|
||||
TemplateScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -15,11 +15,11 @@ import 'package:provider/provider.dart';
|
|||
|
||||
class WalletViewScreen extends StatelessWidget {
|
||||
const WalletViewScreen(
|
||||
{@required this.pubkey, this.username, this.avatar, Key key})
|
||||
{required this.pubkey, this.username, this.avatar, Key? key})
|
||||
: super(key: key);
|
||||
final String pubkey;
|
||||
final String username;
|
||||
final Image avatar;
|
||||
final String? pubkey;
|
||||
final String? username;
|
||||
final Image? avatar;
|
||||
final double buttonSize = 100;
|
||||
final double buttonFontSize = 18;
|
||||
|
||||
|
@ -186,7 +186,7 @@ class WalletViewScreen extends StatelessWidget {
|
|||
// Provider.of<WalletsProfilesProvider>(context);
|
||||
const double shapeSize = 20;
|
||||
MyWalletsProvider _myWalletProvider = MyWalletsProvider();
|
||||
WalletData defaultWallet =
|
||||
WalletData? defaultWallet =
|
||||
_myWalletProvider.getDefaultWallet(configBox.get('currentChest'));
|
||||
|
||||
showModalBottomSheet<void>(
|
||||
|
@ -257,7 +257,7 @@ class WalletViewScreen extends StatelessWidget {
|
|||
// borderRadius: BorderRadius.circular(8)),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Colors.grey[500], width: 2),
|
||||
color: Colors.grey[500]!, width: 2),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
contentPadding: const EdgeInsets.all(20),
|
||||
|
@ -342,7 +342,7 @@ class WalletViewScreen extends StatelessWidget {
|
|||
_historyProvider.snackCopyKey(context);
|
||||
},
|
||||
child: Text(
|
||||
_historyProvider.getShortPubkey(pubkey),
|
||||
_historyProvider.getShortPubkey(pubkey!),
|
||||
style: const TextStyle(
|
||||
fontSize: 30,
|
||||
fontWeight: FontWeight.w800,
|
||||
|
@ -361,20 +361,20 @@ class WalletViewScreen extends StatelessWidget {
|
|||
},
|
||||
),
|
||||
builder: (QueryResult result,
|
||||
{VoidCallback refetch, FetchMore fetchMore}) {
|
||||
{VoidCallback? refetch, FetchMore? fetchMore}) {
|
||||
if (result.isLoading || result.hasException) {
|
||||
return const Text('...');
|
||||
} else if (result.data['idty'] == null ||
|
||||
result.data['idty']['username'] == null) {
|
||||
} else if (result.data!['idty'] == null ||
|
||||
result.data!['idty']['username'] == null) {
|
||||
g1WalletsBox.get(pubkey)?.username = '';
|
||||
return const Text('');
|
||||
} else {
|
||||
g1WalletsBox.get(pubkey)?.username =
|
||||
result?.data['idty']['username'] ?? '';
|
||||
result.data!['idty']['username'] ?? '';
|
||||
return SizedBox(
|
||||
width: 230,
|
||||
child: Text(
|
||||
result?.data['idty']['username'] ?? '',
|
||||
result.data!['idty']['username'] ?? '',
|
||||
style: const TextStyle(
|
||||
fontSize: 27,
|
||||
color: Color(0xff814C00),
|
||||
|
@ -389,7 +389,7 @@ class WalletViewScreen extends StatelessWidget {
|
|||
SizedBox(
|
||||
width: 230,
|
||||
child: Text(
|
||||
g1WalletsBox.get(pubkey)?.username,
|
||||
g1WalletsBox.get(pubkey)?.username ?? '',
|
||||
style: const TextStyle(
|
||||
fontSize: 27,
|
||||
color: Color(0xff814C00),
|
||||
|
@ -400,7 +400,7 @@ class WalletViewScreen extends StatelessWidget {
|
|||
SizedBox(
|
||||
width: 230,
|
||||
child: Text(
|
||||
username,
|
||||
username!,
|
||||
style: const TextStyle(
|
||||
fontSize: 27,
|
||||
color: Color(0xff814C00),
|
||||
|
@ -415,7 +415,7 @@ class WalletViewScreen extends StatelessWidget {
|
|||
return SizedBox(
|
||||
width: 230,
|
||||
child: Text(
|
||||
snapshot.data ?? '-',
|
||||
snapshot.data.toString(),
|
||||
style: const TextStyle(
|
||||
fontSize: 18, color: Colors.black),
|
||||
),
|
||||
|
@ -429,7 +429,7 @@ class WalletViewScreen extends StatelessWidget {
|
|||
FutureBuilder(
|
||||
future: _cesiumPlusProvider.getAvatar(pubkey, _avatarSize),
|
||||
builder:
|
||||
(BuildContext context, AsyncSnapshot<Image> _avatar) {
|
||||
(BuildContext context, AsyncSnapshot<Image?> _avatar) {
|
||||
if (_avatar.connectionState != ConnectionState.done) {
|
||||
return Stack(children: [
|
||||
ClipOval(
|
||||
|
@ -461,7 +461,7 @@ class WalletViewScreen extends StatelessWidget {
|
|||
},
|
||||
child: ClipOval(
|
||||
child: Image(
|
||||
image: _avatar.data.image,
|
||||
image: _avatar.data!.image,
|
||||
height: _avatarSize,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
|
@ -485,7 +485,7 @@ class WalletViewScreen extends StatelessWidget {
|
|||
},
|
||||
child: ClipOval(
|
||||
child: Image(
|
||||
image: avatar.image,
|
||||
image: avatar!.image,
|
||||
height: _avatarSize,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
|
|
|
@ -8,7 +8,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||
version: 0.0.4+4
|
||||
|
||||
environment:
|
||||
sdk: ">=2.7.0 <3.0.0"
|
||||
sdk: '>=2.12.0 <3.0.0'
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
|
|
|
@ -15,19 +15,19 @@ void main() {
|
|||
final manageWalletsFinder = find.byValueKey('manageWallets');
|
||||
// final buttonFinder = find.byValueKey('increment');
|
||||
|
||||
FlutterDriver driver;
|
||||
String pinCode;
|
||||
FlutterDriver? driver;
|
||||
String? pinCode;
|
||||
|
||||
// Connect to the Flutter driver before running any tests.
|
||||
setUpAll(() async {
|
||||
driver = await FlutterDriver.connect();
|
||||
await driver.waitUntilFirstFrameRasterized();
|
||||
await driver!.waitUntilFirstFrameRasterized();
|
||||
});
|
||||
|
||||
// Close the connection to the driver after the tests have completed.
|
||||
tearDownAll(() async {
|
||||
if (driver != null) {
|
||||
driver.close();
|
||||
driver!.close();
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -35,12 +35,12 @@ void main() {
|
|||
|
||||
// Function to tap the widget by key
|
||||
Future tapOn(String key) async {
|
||||
await driver.tap(find.byValueKey(key));
|
||||
await driver!.tap(find.byValueKey(key));
|
||||
}
|
||||
|
||||
// Easy get text
|
||||
Future<String> getText(String text) async {
|
||||
return await driver.getText(find.byValueKey(
|
||||
return await driver!.getText(find.byValueKey(
|
||||
text,
|
||||
));
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ void main() {
|
|||
Future<bool> isPresent(SerializableFinder byValueKey,
|
||||
{Duration timeout = const Duration(seconds: 1)}) async {
|
||||
try {
|
||||
await driver.waitFor(byValueKey, timeout: timeout);
|
||||
await driver!.waitFor(byValueKey, timeout: timeout);
|
||||
return true;
|
||||
} catch (exception) {
|
||||
return false;
|
||||
|
@ -97,7 +97,7 @@ void main() {
|
|||
}
|
||||
|
||||
// Fast creation of new Keychain
|
||||
Future<String> createNewKeychain(String name) async {
|
||||
Future<String?> createNewKeychain(String name) async {
|
||||
await tapOn('drawerMenu');
|
||||
await sleep(300);
|
||||
await tapOn('parameters');
|
||||
|
@ -110,9 +110,9 @@ void main() {
|
|||
pinCode = await getText('generatedPin');
|
||||
await tapOn('storeKeychain');
|
||||
await sleep(100);
|
||||
await driver.enterText('triche');
|
||||
await driver!.enterText('triche');
|
||||
await tapOn('walletName');
|
||||
await driver.enterText(name);
|
||||
await driver!.enterText(name);
|
||||
await sleep(50);
|
||||
await tapOn('confirmStorage');
|
||||
await sleep(300);
|
||||
|
@ -124,7 +124,7 @@ void main() {
|
|||
test('OnBoarding - Open wallets management', (
|
||||
{timeout = Timeout.none}) async {
|
||||
// await driver.runUnsynchronized(() async { // Needed if we want to manage async drivers
|
||||
await driver.tap(manageWalletsFinder);
|
||||
await driver!.tap(manageWalletsFinder);
|
||||
|
||||
// If a wallet exist, go to delete theme all
|
||||
if (!await isPresent(find.byValueKey('goStep1'))) {
|
||||
|
@ -132,7 +132,7 @@ void main() {
|
|||
|
||||
await deleteAllWallets();
|
||||
|
||||
await driver.tap(manageWalletsFinder);
|
||||
await driver!.tap(manageWalletsFinder);
|
||||
}
|
||||
|
||||
// Get the SerializableFinder for text widget with key 'textOnboarding'
|
||||
|
@ -143,7 +143,7 @@ void main() {
|
|||
await sleep(100);
|
||||
|
||||
// Verify onboarding is starting, with text
|
||||
expect(await driver.getText(textOnboarding),
|
||||
expect(await driver!.getText(textOnboarding),
|
||||
"Je ne connais pour l’instant aucun de vos portefeuilles.\n\nVous pouvez en créer un nouveau, ou bien importer un portefeuille Cesium existant.");
|
||||
});
|
||||
|
||||
|
@ -157,7 +157,7 @@ void main() {
|
|||
await tapOn('goStep6');
|
||||
|
||||
expect(
|
||||
await driver.getText(find.byValueKey(
|
||||
await driver!.getText(find.byValueKey(
|
||||
'step6',
|
||||
)),
|
||||
"J’ai généré votre phrase de restauration !\nTâchez de la garder bien secrète, car elle permet à quiconque la connaît d’accéder à tous vos portefeuilles.");
|
||||
|
@ -189,10 +189,10 @@ void main() {
|
|||
)];
|
||||
|
||||
// Enter the expected word
|
||||
await driver.enterText(goodWord);
|
||||
await driver!.enterText(goodWord);
|
||||
|
||||
// Check if word is valid
|
||||
await driver.waitFor(find.text("C'est le bon mot !"));
|
||||
await driver!.waitFor(find.text("C'est le bon mot !"));
|
||||
|
||||
// Continue onboarding workflow
|
||||
await tapOn('goStep9');
|
||||
|
@ -245,7 +245,7 @@ void main() {
|
|||
// await tapOn('formKey2');
|
||||
|
||||
//Enter good secret code
|
||||
await driver.enterText(pinCode);
|
||||
await driver!.enterText(pinCode!);
|
||||
|
||||
expect(await getText('step13'),
|
||||
"Top !\n\nVotre trousseau de clef et votre portefeuille ont été créés avec un immense succès.\n\nFélicitations !");
|
||||
|
@ -259,29 +259,29 @@ void main() {
|
|||
await sleep(300);
|
||||
|
||||
// Go to first derivation and rename it
|
||||
await driver.tap(find.text('Mon portefeuille courant'));
|
||||
await driver!.tap(find.text('Mon portefeuille courant'));
|
||||
await sleep(300);
|
||||
await tapOn('renameWallet');
|
||||
await sleep(100);
|
||||
await tapOn('walletName');
|
||||
await sleep(100);
|
||||
await driver.enterText('Renommage wallet 1');
|
||||
await driver!.enterText('Renommage wallet 1');
|
||||
await sleep(300);
|
||||
await tapOn('renameWallet');
|
||||
await sleep(400);
|
||||
await driver.waitFor(find.text('Renommage wallet 1'), timeout: timeout);
|
||||
await driver!.waitFor(find.text('Renommage wallet 1'), timeout: timeout);
|
||||
// expect(await getText('walletName'), "Renommage wallet 1");
|
||||
await goBack();
|
||||
});
|
||||
|
||||
test('My wallets - Create a derivations, open thems, tap all buttons', (
|
||||
{timeout = const Duration(seconds: 2)}) async {
|
||||
await driver.waitFor(find.text('Renommage wallet 1'), timeout: timeout);
|
||||
await driver!.waitFor(find.text('Renommage wallet 1'), timeout: timeout);
|
||||
// Add a second derivation
|
||||
await createDerivation();
|
||||
|
||||
// Go to second derivation options
|
||||
await driver.tap(find.text('Portefeuille 2'));
|
||||
await driver!.tap(find.text('Portefeuille 2'));
|
||||
await sleep(100);
|
||||
|
||||
// Test options
|
||||
|
@ -297,7 +297,7 @@ void main() {
|
|||
await tapOn('setDefaultWallet');
|
||||
await sleep(50);
|
||||
await tapOn('copyPubkey');
|
||||
await driver.waitFor(find
|
||||
await driver!.waitFor(find
|
||||
.text('Cette clé publique a été copié dans votre presse-papier.'));
|
||||
await goBack();
|
||||
|
||||
|
@ -309,7 +309,7 @@ void main() {
|
|||
await sleep(50);
|
||||
|
||||
// Go to third derivation options
|
||||
await driver.tap(find.text('Portefeuille 3'));
|
||||
await driver!.tap(find.text('Portefeuille 3'));
|
||||
await sleep(100);
|
||||
await tapOn('displayBalance');
|
||||
|
||||
|
@ -320,7 +320,7 @@ void main() {
|
|||
test('My wallets - Extra tests', (
|
||||
{timeout = const Duration(seconds: 2)}) async {
|
||||
// Add derivation 5,6 and 7
|
||||
await driver.waitFor(find.text('Portefeuille 4'), timeout: timeout);
|
||||
await driver!.waitFor(find.text('Portefeuille 4'), timeout: timeout);
|
||||
await createDerivation();
|
||||
await createDerivation();
|
||||
await createDerivation();
|
||||
|
@ -331,27 +331,27 @@ void main() {
|
|||
await tapOn('manageWallets');
|
||||
await sleep(200);
|
||||
//Enter secret code
|
||||
await driver.enterText(pinCode);
|
||||
await driver!.enterText(pinCode!);
|
||||
await sleep(200);
|
||||
|
||||
// Go to derivation 6 and delete it
|
||||
await driver.tap(find.text('Portefeuille 6'));
|
||||
await driver!.tap(find.text('Portefeuille 6'));
|
||||
await sleep(100);
|
||||
await deleteWallet(true);
|
||||
|
||||
// Go to 2nd derivation and check if it's de default
|
||||
await driver.tap(find.text('Portefeuille 2'));
|
||||
await driver.waitFor(find.text('Ce portefeuille est celui par defaut'));
|
||||
await driver!.tap(find.text('Portefeuille 2'));
|
||||
await driver!.waitFor(find.text('Ce portefeuille est celui par defaut'));
|
||||
await tapOn('setDefaultWallet');
|
||||
await sleep(100);
|
||||
await driver.waitFor(find.text('Ce portefeuille est celui par defaut'));
|
||||
await driver!.waitFor(find.text('Ce portefeuille est celui par defaut'));
|
||||
await sleep(300);
|
||||
|
||||
// Display history, copy pubkey, go back and rename wallet name
|
||||
await tapOn('displayHistory');
|
||||
await sleep(400);
|
||||
await tapOn('copyPubkey');
|
||||
await driver.waitFor(find
|
||||
await driver!.waitFor(find
|
||||
.text('Cette clé publique a été copié dans votre presse-papier.'));
|
||||
await sleep(800);
|
||||
await goBack();
|
||||
|
@ -360,70 +360,70 @@ void main() {
|
|||
await sleep(100);
|
||||
await tapOn('walletName');
|
||||
await sleep(100);
|
||||
await driver.enterText('Renommage wallet 2');
|
||||
await driver!.enterText('Renommage wallet 2');
|
||||
await sleep(300);
|
||||
await tapOn('renameWallet');
|
||||
await sleep(400);
|
||||
await goBack();
|
||||
await driver.waitFor(find.text('Renommage wallet 2'));
|
||||
await driver.scrollIntoView(find.text('+'));
|
||||
await driver!.waitFor(find.text('Renommage wallet 2'));
|
||||
await driver!.scrollIntoView(find.text('+'));
|
||||
await createDerivation();
|
||||
await createDerivation();
|
||||
await driver.scrollIntoView(find.text('+'));
|
||||
await driver!.scrollIntoView(find.text('+'));
|
||||
await createDerivation();
|
||||
await createDerivation();
|
||||
await driver.scrollIntoView(find.text('+'));
|
||||
await driver!.scrollIntoView(find.text('+'));
|
||||
await createDerivation();
|
||||
await createDerivation();
|
||||
await driver.scrollIntoView(find.text('+'));
|
||||
await driver!.scrollIntoView(find.text('+'));
|
||||
await createDerivation();
|
||||
await createDerivation();
|
||||
await driver.scrollIntoView(find.text('+'));
|
||||
await driver!.scrollIntoView(find.text('+'));
|
||||
await createDerivation();
|
||||
await createDerivation();
|
||||
await driver.scrollIntoView(find.text('+'));
|
||||
await driver!.scrollIntoView(find.text('+'));
|
||||
await createDerivation();
|
||||
await createDerivation();
|
||||
await driver.scrollIntoView(find.text('+'));
|
||||
await driver!.scrollIntoView(find.text('+'));
|
||||
await createDerivation();
|
||||
await sleep(400);
|
||||
|
||||
// Scroll the wallet screen until Derivation 20 and open it
|
||||
await driver.scrollUntilVisible(
|
||||
await driver!.scrollUntilVisible(
|
||||
find.byValueKey('listWallets'),
|
||||
find.text('Portefeuille 20'),
|
||||
dyScroll: -300.0,
|
||||
);
|
||||
|
||||
await driver.waitFor(find.text('Portefeuille 20'));
|
||||
await driver!.waitFor(find.text('Portefeuille 20'));
|
||||
await sleep(400);
|
||||
await driver.tap(find.text('Portefeuille 20'));
|
||||
await driver!.tap(find.text('Portefeuille 20'));
|
||||
await tapOn('copyPubkey');
|
||||
});
|
||||
|
||||
test('Search - Search Pi profile, navigate in history transactions', (
|
||||
{timeout = const Duration(seconds: 2)}) async {
|
||||
await driver.waitFor(find.text('Portefeuille 20'), timeout: timeout);
|
||||
await driver!.waitFor(find.text('Portefeuille 20'), timeout: timeout);
|
||||
await goBack();
|
||||
await goBack();
|
||||
await sleep(200);
|
||||
await tapOn('searchIcon');
|
||||
await sleep(400);
|
||||
await driver.enterText('D2meevcAHFTS2gQMvmRW5Hzi25jDdikk4nC4u1FkwRaU');
|
||||
await driver!.enterText('D2meevcAHFTS2gQMvmRW5Hzi25jDdikk4nC4u1FkwRaU');
|
||||
await sleep(100);
|
||||
await tapOn('copyPubkey');
|
||||
await sleep(500);
|
||||
await tapOn('switchPayHistory');
|
||||
await sleep(1200);
|
||||
// await driver.scrollIntoView(find.byValueKey('listTransactions'));
|
||||
await driver.scrollUntilVisible(
|
||||
await driver!.scrollUntilVisible(
|
||||
find.byValueKey('listTransactions'),
|
||||
find.byValueKey('transaction35'),
|
||||
dyScroll: -600.0,
|
||||
);
|
||||
await sleep(100);
|
||||
await tapOn('transaction33');
|
||||
await driver.waitFor(find.text('Commentaire:'));
|
||||
await driver!.waitFor(find.text('Commentaire:'));
|
||||
|
||||
// Want to paste pubkey copied, but doesn't work actualy with flutter driver: https://github.com/flutter/flutter/issues/47448
|
||||
// final ClipboardData pubkeyCopied =
|
||||
|
@ -435,19 +435,19 @@ void main() {
|
|||
|
||||
test('Wallet generation - Fast wallets generations', (
|
||||
{timeout = const Duration(seconds: 2)}) async {
|
||||
await driver.waitFor(find.text('Commentaire:'), timeout: timeout);
|
||||
await driver!.waitFor(find.text('Commentaire:'), timeout: timeout);
|
||||
await goBack();
|
||||
await goBack();
|
||||
await deleteAllWallets();
|
||||
await sleep(100);
|
||||
final String pincode = await createNewKeychain('Fast wallet');
|
||||
final String pincode = await (createNewKeychain('Fast wallet') as FutureOr<String>);
|
||||
await sleep(200);
|
||||
await driver.enterText(pincode);
|
||||
await driver!.enterText(pincode);
|
||||
await sleep(100);
|
||||
await createDerivation();
|
||||
await sleep(100);
|
||||
await driver.tap(find.text('Fast wallet'));
|
||||
await driver.waitFor(find.text('Fast wallet'));
|
||||
await driver!.tap(find.text('Fast wallet'));
|
||||
await driver!.waitFor(find.text('Fast wallet'));
|
||||
// Wait 3 seconds at the end
|
||||
await sleep(3000);
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue