Check network state, try to reconnect if network up, display message if offline

This commit is contained in:
poka 2022-06-12 18:03:17 +02:00
parent 29505ad1be
commit 7c11146278
13 changed files with 283 additions and 181 deletions

View File

@ -27,7 +27,7 @@ class HomeProvider with ChangeNotifier {
Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850])); Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850]));
Widget appBarExplorer = Widget appBarExplorer =
Text('Explorateur', style: TextStyle(color: Colors.grey[850])); Text('Explorateur', style: TextStyle(color: Colors.grey[850]));
String homeMessage = "y'a pas de lézard ;-)"; String homeMessage = "Chargement en cours ...";
String defaultMessage = "y'a pas de lézard ;-)"; String defaultMessage = "y'a pas de lézard ;-)";
Future<void> initHive() async { Future<void> initHive() async {

View File

@ -50,6 +50,12 @@ class SubstrateSdk with ChangeNotifier {
List<NetworkParams> node = []; List<NetworkParams> node = [];
HomeProvider _homeProvider = Provider.of<HomeProvider>(ctx, listen: false); HomeProvider _homeProvider = Provider.of<HomeProvider>(ctx, listen: false);
// var connectivityResult = await (Connectivity().checkConnectivity());
// if (connectivityResult == ConnectivityResult.mobile ||
// connectivityResult == ConnectivityResult.wifi) {
// _homeProvider.changeMessage("Vous n'êtes pas connecté à internet", 0);
// return;
// }
_homeProvider.changeMessage("Connexion en cours...", 0); _homeProvider.changeMessage("Connexion en cours...", 0);
for (String _endpoint in configBox.get('endpoint')) { for (String _endpoint in configBox.get('endpoint')) {
@ -100,12 +106,17 @@ class SubstrateSdk with ChangeNotifier {
// Subscribe bloc number // Subscribe bloc number
sdk.api.setting.subscribeBestNumber((res) { sdk.api.setting.subscribeBestNumber((res) {
blocNumber = int.parse(res.toString()); blocNumber = int.parse(res.toString());
// log.d(sdk.api.connectedNode?.endpoint);
if (sdk.api.connectedNode?.endpoint == null) { if (sdk.api.connectedNode?.endpoint == null) {
nodeConnected = false;
_homeProvider.changeMessage("Le réseau a été perdu...", 0); _homeProvider.changeMessage("Le réseau a été perdu...", 0);
} else {
nodeConnected = true;
} }
notifyListeners(); notifyListeners();
}); });
// currencyName = await getCurencyName(); // currencyName = await getCurencyName();
notifyListeners(); notifyListeners();
_homeProvider.changeMessage( _homeProvider.changeMessage(
@ -250,9 +261,12 @@ class SubstrateSdk with ChangeNotifier {
Future<double> getBalance(String address, {bool isUd = false}) async { Future<double> getBalance(String address, {bool isUd = false}) async {
double balance = 0.0; double balance = 0.0;
// log.d('nodeConnected: ' + nodeConnected.toString());
if (nodeConnected) { if (nodeConnected) {
final brutBalance = await sdk.api.account.queryBalance(address); final brutBalance = await sdk.api.account.queryBalance(address);
balance = int.parse(brutBalance!.freeBalance) / 100; balance = int.parse(brutBalance!.freeBalance) / 100;
} else {
balance = -1;
} }
return balance; return balance;
} }

View File

@ -318,7 +318,8 @@ class WalletOptionsProvider with ChangeNotifier {
Map<String, double> balanceCache = {}; Map<String, double> balanceCache = {};
Widget balance(BuildContext context, String address, double size, Widget balance(BuildContext context, String address, double size,
[Color _color = Colors.black]) { [Color _color = Colors.black,
Color _loadingColor = const Color(0xffd07316)]) {
return Column(children: <Widget>[ return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, _sdk, _) { Consumer<SubstrateSdk>(builder: (context, _sdk, _) {
return FutureBuilder( return FutureBuilder(
@ -326,7 +327,8 @@ Widget balance(BuildContext context, String address, double size,
builder: (BuildContext context, AsyncSnapshot<double> _balance) { builder: (BuildContext context, AsyncSnapshot<double> _balance) {
if (_balance.connectionState != ConnectionState.done || if (_balance.connectionState != ConnectionState.done ||
_balance.hasError) { _balance.hasError) {
if (balanceCache[address] != null) { if (balanceCache[address] != null &&
balanceCache[address] != -1) {
return Text( return Text(
"${balanceCache[address]!.toString()} $currencyName", "${balanceCache[address]!.toString()} $currencyName",
style: TextStyle( style: TextStyle(
@ -336,20 +338,24 @@ Widget balance(BuildContext context, String address, double size,
height: 15, height: 15,
width: 15, width: 15,
child: CircularProgressIndicator( child: CircularProgressIndicator(
color: orangeC, color: _loadingColor,
strokeWidth: 2, strokeWidth: 2,
), ),
); );
} }
} }
balanceCache[address] = _balance.data!; balanceCache[address] = _balance.data!;
return Text( if (balanceCache[address] != -1) {
"${balanceCache[address]!.toString()} $currencyName", return Text(
style: TextStyle( "${balanceCache[address]!.toString()} $currencyName",
fontSize: isTall ? size : size * 0.9, style: TextStyle(
color: _color, fontSize: isTall ? size : size * 0.9,
), color: _color,
); ),
);
} else {
return const Text('');
}
}); });
}), }),
]); ]);
@ -362,9 +368,9 @@ Widget getCerts(BuildContext context, String address, double size,
return FutureBuilder( return FutureBuilder(
future: _sdk.getCerts(address), future: _sdk.getCerts(address),
builder: (BuildContext context, AsyncSnapshot<List<int>> _certs) { builder: (BuildContext context, AsyncSnapshot<List<int>> _certs) {
// log.d(_certs.data); log.d(_certs.data);
return _certs.data?[0] != 0 return _certs.data?[0] != 0 && _certs.data != null
? Row( ? Row(
children: [ children: [
Image.asset('assets/medal.png', height: 20), Image.asset('assets/medal.png', height: 20),

View File

@ -1,6 +1,8 @@
import 'package:dots_indicator/dots_indicator.dart'; import 'package:dots_indicator/dots_indicator.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:provider/provider.dart';
class CommonElements { class CommonElements {
// Exemple de Widget // Exemple de Widget
@ -145,6 +147,33 @@ class CommonElements {
), ),
); );
} }
Widget offlineInfo(BuildContext context) {
// SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
final double screenWidth = MediaQuery.of(context).size.width;
return Consumer<SubstrateSdk>(builder: (context, _sub, _) {
return Visibility(
visible: !_sub.nodeConnected,
child: Positioned(
top: 0,
child: Container(
height: 30,
width: screenWidth,
color: Colors.grey[800],
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Vous êtes hors ligne...",
style: TextStyle(color: Colors.grey[50]),
textAlign: TextAlign.center,
),
],
)),
),
);
});
}
} }
class SmoothTransition extends PageRouteBuilder { class SmoothTransition extends PageRouteBuilder {
@ -277,6 +306,7 @@ Future<void> infoPopup(BuildContext context, String title) async {
); );
} }
// Widget geckoAppBar() { // Widget geckoAppBar() {
// return AppBar( // return AppBar(
// toolbarHeight: 60 * ratio, // toolbarHeight: 60 * ratio,

View File

@ -1,4 +1,5 @@
import 'package:bubble/bubble.dart'; import 'package:bubble/bubble.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/stateful_wrapper.dart'; import 'package:gecko/models/stateful_wrapper.dart';
import 'package:gecko/providers/chest_provider.dart'; import 'package:gecko/providers/chest_provider.dart';
@ -118,7 +119,24 @@ class HomeScreen extends StatelessWidget {
_myWalletProvider.rebuildWidget(); _myWalletProvider.rebuildWidget();
} }
await _sub.connectNode(ctx); //kopa var connectivityResult =
await (Connectivity().checkConnectivity());
if (connectivityResult != ConnectivityResult.mobile &&
connectivityResult != ConnectivityResult.wifi) {
HomeProvider _homeProvider =
Provider.of<HomeProvider>(ctx, listen: false);
_homeProvider.changeMessage(
"Vous n'êtes pas connecté à internet", 0);
_sub.nodeConnected = false;
}
Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) async {
log.d('Network changed: $result');
await _sub.connectNode(ctx);
});
} }
}); });
}, },

View File

@ -20,6 +20,7 @@ class UnlockingWallet extends StatelessWidget {
WalletData? wallet; WalletData? wallet;
late int currentChestNumber; late int currentChestNumber;
late ChestData currentChest; late ChestData currentChest;
bool canUnlock = true;
// ignore: close_sinks // ignore: close_sinks
StreamController<ErrorAnimationType>? errorController; StreamController<ErrorAnimationType>? errorController;
@ -101,52 +102,54 @@ class UnlockingWallet extends StatelessWidget {
SizedBox(height: 40 * ratio), SizedBox(height: 40 * ratio),
pinForm(context, _pinLenght), pinForm(context, _pinLenght),
SizedBox(height: 3 * ratio), SizedBox(height: 3 * ratio),
InkWell( if (canUnlock)
onTap: () { InkWell(
_walletOptions.changePinCacheChoice();
},
child: Row(children: [
const SizedBox(height: 30),
const Spacer(),
Icon(
configBox.get('isCacheChecked')
? Icons.check_box
: Icons.check_box_outline_blank,
color: orangeC,
),
const SizedBox(width: 8),
Text(
'Garder ce code en mémoire 15 minutes',
style:
TextStyle(fontSize: 16, color: Colors.grey[700]),
),
const Spacer()
]),
),
const SizedBox(height: 10),
InkWell(
key: const Key('chooseChest'),
onTap: () { onTap: () {
Navigator.push( _walletOptions.changePinCacheChoice();
context,
MaterialPageRoute(builder: (context) {
return const ChooseChest();
}),
);
}, },
child: SizedBox( child: Row(children: [
width: 400, const SizedBox(height: 30),
height: 50, const Spacer(),
child: Center( Icon(
child: Text( configBox.get('isCacheChecked')
'Changer de coffre', ? Icons.check_box
style: TextStyle( : Icons.check_box_outline_blank,
fontSize: 22, color: orangeC,
color: orangeC,
fontWeight: FontWeight.w600),
),
), ),
)), const SizedBox(width: 8),
Text(
'Garder ce code en mémoire 15 minutes',
style: TextStyle(
fontSize: 16, color: Colors.grey[700]),
),
const Spacer()
]),
),
const SizedBox(height: 10),
if (canUnlock)
InkWell(
key: const Key('chooseChest'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const ChooseChest();
}),
);
},
child: SizedBox(
width: 400,
height: 50,
child: Center(
child: Text(
'Changer de coffre',
style: TextStyle(
fontSize: 22,
color: orangeC,
fontWeight: FontWeight.w600),
),
),
)),
]), ]),
]), ]),
]), ]),
@ -164,11 +167,21 @@ class UnlockingWallet extends StatelessWidget {
MyWalletsProvider _myWalletProvider = MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context); Provider.of<MyWalletsProvider>(context);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
WalletData? defaultWallet = _myWalletProvider.getDefaultWallet();
FocusNode pinFocus = FocusNode(); FocusNode pinFocus = FocusNode();
WalletData defaultWallet = _myWalletProvider.getDefaultWallet();
// defaultWallet.address = null;
if (defaultWallet.address == null) {
canUnlock = false;
return Text(
'Impossible de retrouver votre\nportefeuille par défaut.\nID: ${defaultWallet.id()}',
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.redAccent, fontWeight: FontWeight.w500),
);
}
return Form( return Form(
key: formKey, key: formKey,
child: Padding( child: Padding(

View File

@ -8,6 +8,7 @@ import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/manage_membership.dart'; import 'package:gecko/screens/myWallets/manage_membership.dart';
import 'package:gecko/screens/qrcode_fullscreen.dart'; import 'package:gecko/screens/qrcode_fullscreen.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -70,122 +71,127 @@ class WalletOptions extends StatelessWidget {
), ),
), ),
bottomNavigationBar: _homeProvider.bottomAppBar(context), bottomNavigationBar: _homeProvider.bottomAppBar(context),
body: Builder( body: Stack(children: [
builder: (ctx) => SafeArea( Builder(
child: Column(children: <Widget>[ builder: (ctx) => SafeArea(
Container( child: Column(children: <Widget>[
height: isTall ? 5 : 0, Container(
color: yellowC, height: isTall ? 5 : 0,
), color: yellowC,
Consumer<WalletOptionsProvider>(
builder: (context, walletProvider, _) {
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
yellowC,
backgroundColor,
],
)),
child: Row(
// mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
const Spacer(flex: 1),
avatar(walletProvider),
const Spacer(flex: 1),
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
walletName(walletProvider, _walletOptions),
SizedBox(height: isTall ? 5 : 0),
// SizedBox(height: isTall ? 5 : 0),
balance(context, walletProvider.address.text, 21),
const SizedBox(width: 30),
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
_walletOptions.idtyStatus(
context, _walletOptions.address.text,
isOwner: true, color: orangeC),
getCerts(context,
walletProvider.address.text, 15),
]),
SizedBox(height: 10 * ratio),
]),
const Spacer(flex: 2),
]),
);
}),
Expanded(
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return QrCodeFullscreen(
_walletOptions.address.text,
);
}),
);
},
child: QrImageWidget(
data: _walletOptions.address.text,
version: QrVersions.auto,
size: isTall ? 150 : 80,
),
),
SizedBox(height: 15 * ratio),
Consumer<WalletOptionsProvider>(
builder: (context, walletProvider, _) {
return Column(children: [
pubkeyWidget(walletProvider, ctx),
SizedBox(height: 10 * ratio),
historyWidget(
context, _historyProvider, walletProvider),
SizedBox(height: 12 * ratio),
setDefaultWalletWidget(
context,
walletProvider,
_myWalletProvider,
_walletOptions,
_currentChest),
SizedBox(height: 17 * ratio),
// walletProvider.isMember(context, _walletOptions.address.text)
FutureBuilder(
future: walletProvider.isMember(
context, _walletOptions.address.text),
builder: (BuildContext context,
AsyncSnapshot<bool> _isMember) {
if (_isMember.connectionState !=
ConnectionState.done ||
_isMember.hasError) {
return const Text('');
}
return Column(children: [
if (!walletProvider.isDefaultWallet &&
!_isMember.data!)
deleteWallet(context, walletProvider,
_currentChest)
else
const SizedBox(),
if (_isMember.data!)
manageMemberStatus(context)
]);
}),
]);
}),
]),
), ),
), Consumer<WalletOptionsProvider>(
]), builder: (context, walletProvider, _) {
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
yellowC,
backgroundColor,
],
)),
child: Row(
// mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
const Spacer(flex: 1),
avatar(walletProvider),
const Spacer(flex: 1),
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
walletName(walletProvider, _walletOptions),
SizedBox(height: isTall ? 5 : 0),
// SizedBox(height: isTall ? 5 : 0),
balance(
context, walletProvider.address.text, 21),
const SizedBox(width: 30),
Column(
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
_walletOptions.idtyStatus(
context, _walletOptions.address.text,
isOwner: true, color: orangeC),
getCerts(context,
walletProvider.address.text, 15),
]),
SizedBox(height: 10 * ratio),
]),
const Spacer(flex: 2),
]),
);
}),
Expanded(
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return QrCodeFullscreen(
_walletOptions.address.text,
);
}),
);
},
child: QrImageWidget(
data: _walletOptions.address.text,
version: QrVersions.auto,
size: isTall ? 150 : 80,
),
),
SizedBox(height: 15 * ratio),
Consumer<WalletOptionsProvider>(
builder: (context, walletProvider, _) {
return Column(children: [
pubkeyWidget(walletProvider, ctx),
SizedBox(height: 10 * ratio),
historyWidget(
context, _historyProvider, walletProvider),
SizedBox(height: 12 * ratio),
setDefaultWalletWidget(
context,
walletProvider,
_myWalletProvider,
_walletOptions,
_currentChest),
SizedBox(height: 17 * ratio),
// walletProvider.isMember(context, _walletOptions.address.text)
FutureBuilder(
future: walletProvider.isMember(
context, _walletOptions.address.text),
builder: (BuildContext context,
AsyncSnapshot<bool> _isMember) {
if (_isMember.connectionState !=
ConnectionState.done ||
_isMember.hasError) {
return const Text('');
}
return Column(children: [
if (!walletProvider.isDefaultWallet &&
!_isMember.data!)
deleteWallet(context, walletProvider,
_currentChest)
else
const SizedBox(),
if (_isMember.data!)
manageMemberStatus(context)
]);
}),
]);
}),
]),
),
),
]),
),
), ),
), CommonElements().offlineInfo(context),
]),
), ),
); );
} }
@ -501,7 +507,7 @@ class WalletOptions extends StatelessWidget {
return const Text(''); return const Text('');
} }
final double _balance = final double _balance =
balanceCache[walletProvider.address.text] ?? 0; balanceCache[walletProvider.address.text] ?? -1;
final bool canDelete = !isDefaultWallet && final bool canDelete = !isDefaultWallet &&
!_hasConsumers.data! && !_hasConsumers.data! &&
(_balance > 2 || _balance == 0); (_balance > 2 || _balance == 0);

View File

@ -61,7 +61,12 @@ class WalletsHome extends StatelessWidget {
), ),
bottomNavigationBar: _homeProvider.bottomAppBar(context), bottomNavigationBar: _homeProvider.bottomAppBar(context),
body: SafeArea( body: SafeArea(
child: myWalletsTiles(context, _currentChestNumber!), child: Stack(
children: [
myWalletsTiles(context, _currentChestNumber!),
CommonElements().offlineInfo(context),
],
),
), ),
), ),
); );
@ -322,7 +327,11 @@ class WalletsHome extends StatelessWidget {
// style: TextStyle(color: isDefault ? Colors.white : Colors.black), // style: TextStyle(color: isDefault ? Colors.white : Colors.black),
// ), // ),
balance( balance(
context, _address, 15, isDefault ? Colors.white : Colors.black) context,
_address,
15,
isDefault ? Colors.white : Colors.black,
isDefault ? yellowC : orangeC)
]), ]),
), ),
); );

View File

@ -3,6 +3,7 @@ import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
// import 'package:gecko/providers/home.dart'; // import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/search.dart'; import 'package:gecko/providers/search.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/search_result.dart'; import 'package:gecko/screens/search_result.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// import 'package:gecko/models/home.dart'; // import 'package:gecko/models/home.dart';
@ -44,6 +45,7 @@ class SearchScreen extends StatelessWidget {
// bottomNavigationBar: _homeProvider.bottomAppBar(context), // bottomNavigationBar: _homeProvider.bottomAppBar(context),
body: SafeArea( body: SafeArea(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
CommonElements().offlineInfo(context),
SizedBox(height: isTall ? 200 : 100), SizedBox(height: isTall ? 200 : 100),
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 17), padding: const EdgeInsets.symmetric(horizontal: 17),

View File

@ -8,6 +8,7 @@ import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/providers/search.dart'; import 'package:gecko/providers/search.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/wallet_view.dart'; import 'package:gecko/screens/wallet_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -46,6 +47,7 @@ class SearchResultScreen extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
CommonElements().offlineInfo(context),
const SizedBox(height: 30), const SizedBox(height: 30),
RichText( RichText(
text: TextSpan( text: TextSpan(

View File

@ -898,6 +898,7 @@ class WalletViewScreen extends StatelessWidget {
]), ]),
]), ]),
), ),
CommonElements().offlineInfo(context),
]); ]);
} }
} }

View File

@ -205,12 +205,12 @@ packages:
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
connectivity_plus: connectivity_plus:
dependency: transitive dependency: "direct main"
description: description:
name: connectivity_plus name: connectivity_plus
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.2" version: "2.3.3"
connectivity_plus_linux: connectivity_plus_linux:
dependency: transitive dependency: transitive
description: description:
@ -224,7 +224,7 @@ packages:
name: connectivity_plus_macos name: connectivity_plus_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.2" version: "1.2.3"
connectivity_plus_platform_interface: connectivity_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -245,7 +245,7 @@ packages:
name: connectivity_plus_windows name: connectivity_plus_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.1" version: "1.2.2"
convert: convert:
dependency: transitive dependency: transitive
description: description:

View File

@ -70,6 +70,7 @@ dependencies:
ref: gecko-work ref: gecko-work
dots_indicator: ^2.1.0 dots_indicator: ^2.1.0
web_socket_channel: ^2.2.0 web_socket_channel: ^2.2.0
connectivity_plus: ^2.3.3
dev_dependencies: dev_dependencies:
# flutter_launcher_icons: ^0.9.2 # flutter_launcher_icons: ^0.9.2