Migrate to null safety

This commit is contained in:
poka 2021-12-23 12:36:09 +01:00
parent 148302d509
commit bb090b62ce
53 changed files with 451 additions and 470 deletions

View File

@ -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();

View File

@ -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;

View File

@ -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;
}

View File

@ -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 = '';

View File

@ -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!;
}
}

View File

@ -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?,
);
}

View File

@ -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!

View File

@ -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});

View File

@ -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?,
);
}

View File

@ -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) {

View File

@ -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));

View File

@ -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(

View File

@ -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

View File

@ -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];
}
}

View File

@ -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?,
);
}

View 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);

View File

@ -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));
}

View File

@ -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),
),
),

View File

@ -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);

View File

@ -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,
),

View File

@ -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)

View File

@ -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) {

View File

@ -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();
}

View File

@ -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) {

View File

@ -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(

View File

@ -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 =

View File

@ -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) {

View File

@ -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

View File

@ -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!

View File

@ -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,

View File

@ -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);

View File

@ -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) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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(

View File

@ -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) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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,

View File

@ -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) {

View File

@ -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),

View File

@ -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),

View File

@ -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) {

View File

@ -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) {

View File

@ -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,
),

View File

@ -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:

View File

@ -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 linstant 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',
)),
"Jai généré votre phrase de restauration !\nTâchez de la garder bien secrète, car elle permet à quiconque la connaît daccé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);
});