mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2025-03-22 07:09:10 +00:00
load simplex currencies if empty. Quick api call (at least on tests) so we can just call it without a loading service
This commit is contained in:
parent
dc1a38db91
commit
a23c17d83e
2 changed files with 199 additions and 135 deletions
|
@ -1,12 +1,18 @@
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:flutter_svg/svg.dart';
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:stackwallet/models/buy/response_objects/crypto.dart';
|
import 'package:stackwallet/models/buy/response_objects/crypto.dart';
|
||||||
import 'package:stackwallet/models/buy/response_objects/fiat.dart';
|
import 'package:stackwallet/models/buy/response_objects/fiat.dart';
|
||||||
|
import 'package:stackwallet/pages/address_book_views/address_book_view.dart';
|
||||||
import 'package:stackwallet/pages/buy_view/sub_widgets/crypto_selection_view.dart';
|
import 'package:stackwallet/pages/buy_view/sub_widgets/crypto_selection_view.dart';
|
||||||
import 'package:stackwallet/pages/buy_view/sub_widgets/fiat_crypto_toggle.dart';
|
import 'package:stackwallet/pages/buy_view/sub_widgets/fiat_crypto_toggle.dart';
|
||||||
import 'package:stackwallet/pages/buy_view/sub_widgets/fiat_selection_view.dart';
|
import 'package:stackwallet/pages/buy_view/sub_widgets/fiat_selection_view.dart';
|
||||||
|
import 'package:stackwallet/pages/exchange_view/choose_from_stack_view.dart';
|
||||||
import 'package:stackwallet/providers/providers.dart';
|
import 'package:stackwallet/providers/providers.dart';
|
||||||
|
import 'package:stackwallet/services/buy/simplex/simplex_api.dart';
|
||||||
import 'package:stackwallet/utilities/address_utils.dart';
|
import 'package:stackwallet/utilities/address_utils.dart';
|
||||||
import 'package:stackwallet/utilities/assets.dart';
|
import 'package:stackwallet/utilities/assets.dart';
|
||||||
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
|
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
|
||||||
|
@ -17,6 +23,8 @@ import 'package:stackwallet/utilities/logger.dart';
|
||||||
import 'package:stackwallet/utilities/text_styles.dart';
|
import 'package:stackwallet/utilities/text_styles.dart';
|
||||||
import 'package:stackwallet/utilities/theme/stack_colors.dart';
|
import 'package:stackwallet/utilities/theme/stack_colors.dart';
|
||||||
import 'package:stackwallet/utilities/util.dart';
|
import 'package:stackwallet/utilities/util.dart';
|
||||||
|
import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart';
|
||||||
|
import 'package:stackwallet/widgets/custom_loading_overlay.dart';
|
||||||
import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
|
import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
|
||||||
import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart';
|
import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart';
|
||||||
import 'package:stackwallet/widgets/desktop/primary_button.dart';
|
import 'package:stackwallet/widgets/desktop/primary_button.dart';
|
||||||
|
@ -60,6 +68,9 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
List<Fiat>? fiats;
|
List<Fiat>? fiats;
|
||||||
String? _address;
|
String? _address;
|
||||||
|
|
||||||
|
Fiat? selectedFiat;
|
||||||
|
Crypto? selectedCrypto;
|
||||||
|
|
||||||
bool buyWithFiat = true;
|
bool buyWithFiat = true;
|
||||||
bool _addressToggleFlag = false;
|
bool _addressToggleFlag = false;
|
||||||
bool _hovering1 = false;
|
bool _hovering1 = false;
|
||||||
|
@ -70,11 +81,35 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
void cryptoFieldOnChanged(String value) async {}
|
void cryptoFieldOnChanged(String value) async {}
|
||||||
|
|
||||||
void selectCrypto() async {
|
void selectCrypto() async {
|
||||||
final supportedCoins =
|
if (ref.read(supportedSimplexCurrenciesProvider).supportedCryptos.isEmpty) {
|
||||||
ref.read(supportedSimplexCurrenciesProvider).supportedCryptos;
|
bool shouldPop = false;
|
||||||
|
unawaited(
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => WillPopScope(
|
||||||
|
child: const CustomLoadingOverlay(
|
||||||
|
message: "Loading currency data",
|
||||||
|
eventBus: null,
|
||||||
|
),
|
||||||
|
onWillPop: () async => shouldPop,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
await _loadSimplexCurrencies();
|
||||||
|
shouldPop = true;
|
||||||
|
if (mounted) {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await _showFloatingCryptoSelectionSheet(
|
await _showFloatingCryptoSelectionSheet(
|
||||||
coins: supportedCoins, onSelected: (_) {});
|
coins: ref.read(supportedSimplexCurrenciesProvider).supportedCryptos,
|
||||||
|
onSelected: (crypto) {
|
||||||
|
setState(() {
|
||||||
|
selectedCrypto = crypto;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _showFloatingCryptoSelectionSheet({
|
Future<void> _showFloatingCryptoSelectionSheet({
|
||||||
|
@ -149,12 +184,54 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void selectFiat() async {
|
Future<void> selectFiat() async {
|
||||||
final supportedFiats =
|
if (ref.read(supportedSimplexCurrenciesProvider).supportedFiats.isEmpty) {
|
||||||
ref.read(supportedSimplexCurrenciesProvider).supportedFiats;
|
bool shouldPop = false;
|
||||||
|
unawaited(
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => WillPopScope(
|
||||||
|
child: const CustomLoadingOverlay(
|
||||||
|
message: "Loading currency data",
|
||||||
|
eventBus: null,
|
||||||
|
),
|
||||||
|
onWillPop: () async => shouldPop,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
await _loadSimplexCurrencies();
|
||||||
|
shouldPop = true;
|
||||||
|
if (mounted) {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await _showFloatingFiatSelectionSheet(
|
await _showFloatingFiatSelectionSheet(
|
||||||
fiats: supportedFiats, onSelected: (_) {});
|
fiats: ref.read(supportedSimplexCurrenciesProvider).supportedFiats,
|
||||||
|
onSelected: (fiat) {
|
||||||
|
setState(() {
|
||||||
|
selectedFiat = fiat;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _loadSimplexCurrencies() async {
|
||||||
|
final response = await SimplexAPI.instance.getSupported();
|
||||||
|
|
||||||
|
if (response.value != null) {
|
||||||
|
ref
|
||||||
|
.read(supportedSimplexCurrenciesProvider)
|
||||||
|
.updateSupportedCryptos(response.value!.item1);
|
||||||
|
ref
|
||||||
|
.read(supportedSimplexCurrenciesProvider)
|
||||||
|
.updateSupportedFiats(response.value!.item2);
|
||||||
|
} else {
|
||||||
|
Logging.instance.log(
|
||||||
|
"_loadSimplexCurrencies: $response",
|
||||||
|
level: LogLevel.Warning,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _showFloatingFiatSelectionSheet({
|
Future<void> _showFloatingFiatSelectionSheet({
|
||||||
|
@ -235,6 +312,17 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isStackCoin(String? ticker) {
|
||||||
|
if (ticker == null) return false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
coinFromTickerCaseInsensitive(ticker);
|
||||||
|
return true;
|
||||||
|
} on ArgumentError catch (_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
_receiveAddressController = TextEditingController();
|
_receiveAddressController = TextEditingController();
|
||||||
|
@ -246,11 +334,6 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
coins = ref.read(supportedSimplexCurrenciesProvider).supportedCryptos;
|
coins = ref.read(supportedSimplexCurrenciesProvider).supportedCryptos;
|
||||||
fiats = ref.read(supportedSimplexCurrenciesProvider).supportedFiats;
|
fiats = ref.read(supportedSimplexCurrenciesProvider).supportedFiats;
|
||||||
|
|
||||||
// WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
|
||||||
// BuyDataLoadingService().loadAll(
|
|
||||||
// ref); // Why does this need to be called here? Shouldn't it already be called by main.dart?
|
|
||||||
// });
|
|
||||||
|
|
||||||
// TODO set initial crypto to open wallet if a wallet is open
|
// TODO set initial crypto to open wallet if a wallet is open
|
||||||
|
|
||||||
super.initState();
|
super.initState();
|
||||||
|
@ -499,6 +582,39 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
color: Theme.of(context).extension<StackColors>()!.textDark3,
|
color: Theme.of(context).extension<StackColors>()!.textDark3,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (isStackCoin(selectedCrypto?.ticker))
|
||||||
|
BlueTextButton(
|
||||||
|
text: "Choose from stack",
|
||||||
|
onTap: () {
|
||||||
|
try {
|
||||||
|
final coin = coinFromTickerCaseInsensitive(
|
||||||
|
selectedCrypto!.ticker,
|
||||||
|
);
|
||||||
|
Navigator.of(context)
|
||||||
|
.pushNamed(
|
||||||
|
ChooseFromStackView.routeName,
|
||||||
|
arguments: coin,
|
||||||
|
)
|
||||||
|
.then((value) async {
|
||||||
|
if (value is String) {
|
||||||
|
final manager = ref
|
||||||
|
.read(walletsChangeNotifierProvider)
|
||||||
|
.getManager(value);
|
||||||
|
|
||||||
|
// _toController.text = manager.walletName;
|
||||||
|
// model.recipientAddress =
|
||||||
|
// await manager.currentReceivingAddress;
|
||||||
|
_receiveAddressController.text =
|
||||||
|
await manager.currentReceivingAddress;
|
||||||
|
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (e, s) {
|
||||||
|
Logging.instance.log("$e\n$s", level: LogLevel.Info);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
|
@ -569,27 +685,25 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
key: const Key(
|
key: const Key(
|
||||||
"buyViewPasteAddressFieldButtonKey"),
|
"buyViewPasteAddressFieldButtonKey"),
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
print(
|
final ClipboardData? data = await clipboard
|
||||||
"TODO paste; Error: 'ClipboardData' isn't a type.");
|
.getData(Clipboard.kTextPlain);
|
||||||
// final ClipboardData? data = await clipboard
|
if (data?.text != null &&
|
||||||
// .getData(Clipboard.kTextPlain);
|
data!.text!.isNotEmpty) {
|
||||||
// if (data?.text != null &&
|
String content = data.text!.trim();
|
||||||
// data!.text!.isNotEmpty) {
|
if (content.contains("\n")) {
|
||||||
// String content = data.text!.trim();
|
content = content.substring(
|
||||||
// if (content.contains("\n")) {
|
0, content.indexOf("\n"));
|
||||||
// content = content.substring(
|
}
|
||||||
// 0, content.indexOf("\n"));
|
|
||||||
// }
|
_receiveAddressController.text = content;
|
||||||
//
|
_address = content;
|
||||||
// _receiveAddressController.text = content;
|
|
||||||
// _address = content;
|
setState(() {
|
||||||
//
|
_addressToggleFlag =
|
||||||
// setState(() {
|
_receiveAddressController
|
||||||
// _addressToggleFlag =
|
.text.isNotEmpty;
|
||||||
// _receiveAddressController
|
});
|
||||||
// .text.isNotEmpty;
|
}
|
||||||
// });
|
|
||||||
// }
|
|
||||||
},
|
},
|
||||||
child: _receiveAddressController.text.isEmpty
|
child: _receiveAddressController.text.isEmpty
|
||||||
? const ClipboardIcon()
|
? const ClipboardIcon()
|
||||||
|
@ -599,11 +713,9 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
TextFieldIconButton(
|
TextFieldIconButton(
|
||||||
key: const Key("buyViewAddressBookButtonKey"),
|
key: const Key("buyViewAddressBookButtonKey"),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
print('TODO tapped buyViewAddressBookButtonKey');
|
Navigator.of(context).pushNamed(
|
||||||
// Navigator.of(context).pushNamed(
|
AddressBookView.routeName,
|
||||||
// AddressBookView.routeName,
|
);
|
||||||
// arguments: widget.coin,
|
|
||||||
// );
|
|
||||||
},
|
},
|
||||||
child: const AddressBookIcon(),
|
child: const AddressBookIcon(),
|
||||||
),
|
),
|
||||||
|
@ -613,11 +725,6 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
key: const Key("buyViewScanQrButtonKey"),
|
key: const Key("buyViewScanQrButtonKey"),
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
try {
|
try {
|
||||||
// ref
|
|
||||||
// .read(
|
|
||||||
// shouldShowLockscreenOnResumeStateProvider
|
|
||||||
// .state)
|
|
||||||
// .state = false;
|
|
||||||
if (FocusScope.of(context).hasFocus) {
|
if (FocusScope.of(context).hasFocus) {
|
||||||
FocusScope.of(context).unfocus();
|
FocusScope.of(context).unfocus();
|
||||||
await Future<void>.delayed(
|
await Future<void>.delayed(
|
||||||
|
@ -637,76 +744,40 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
"qrResult parsed: $results",
|
"qrResult parsed: $results",
|
||||||
level: LogLevel.Info);
|
level: LogLevel.Info);
|
||||||
|
|
||||||
print('TODO implement QR scanning');
|
if (results.isNotEmpty) {
|
||||||
// if (results.isNotEmpty &&
|
// auto fill address
|
||||||
// results["scheme"] == coin.uriScheme) {
|
_address = results["address"] ?? "";
|
||||||
// // auto fill address
|
_receiveAddressController.text = _address!;
|
||||||
// _address = results["address"] ?? "";
|
|
||||||
// sendToController.text = _address!;
|
setState(() {
|
||||||
//
|
_addressToggleFlag =
|
||||||
// // autofill notes field
|
_receiveAddressController
|
||||||
// if (results["message"] != null) {
|
.text.isNotEmpty;
|
||||||
// noteController.text = results["message"]!;
|
});
|
||||||
// } else if (results["label"] != null) {
|
|
||||||
// noteController.text = results["label"]!;
|
// now check for non standard encoded basic address
|
||||||
// }
|
} else {
|
||||||
//
|
_address = qrResult.rawContent;
|
||||||
// // autofill amount field
|
_receiveAddressController.text =
|
||||||
// if (results["amount"] != null) {
|
_address ?? "";
|
||||||
// final amount =
|
|
||||||
// Decimal.parse(results["amount"]!);
|
setState(() {
|
||||||
// cryptoAmountController.text =
|
_addressToggleFlag =
|
||||||
// Format.localizedStringAsFixed(
|
_receiveAddressController
|
||||||
// value: amount,
|
.text.isNotEmpty;
|
||||||
// locale: ref
|
});
|
||||||
// .read(
|
}
|
||||||
// localeServiceChangeNotifierProvider)
|
} on PlatformException catch (e, s) {
|
||||||
// .locale,
|
|
||||||
// decimalPlaces:
|
|
||||||
// Constants.decimalPlacesForCoin(
|
|
||||||
// coin),
|
|
||||||
// );
|
|
||||||
// amount.toString();
|
|
||||||
// _amountToSend = amount;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// _updatePreviewButtonState(
|
|
||||||
// _address, _amountToSend);
|
|
||||||
// setState(() {
|
|
||||||
// _addressToggleFlag =
|
|
||||||
// sendToController.text.isNotEmpty;
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// // now check for non standard encoded basic address
|
|
||||||
// } else if (ref
|
|
||||||
// .read(walletsChangeNotifierProvider)
|
|
||||||
// .getManager(walletId)
|
|
||||||
// .validateAddress(qrResult.rawContent)) {
|
|
||||||
// _address = qrResult.rawContent;
|
|
||||||
// sendToController.text = _address ?? "";
|
|
||||||
//
|
|
||||||
// _updatePreviewButtonState(
|
|
||||||
// _address, _amountToSend);
|
|
||||||
// setState(() {
|
|
||||||
// _addressToggleFlag =
|
|
||||||
// sendToController.text.isNotEmpty;
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
} /*on PlatformException*/ catch (e, s) {
|
|
||||||
// ref
|
|
||||||
// .read(
|
|
||||||
// shouldShowLockscreenOnResumeStateProvider
|
|
||||||
// .state)
|
|
||||||
// .state = true;
|
|
||||||
// here we ignore the exception caused by not giving permission
|
// here we ignore the exception caused by not giving permission
|
||||||
// to use the camera to scan a qr code
|
// to use the camera to scan a qr code
|
||||||
Logging.instance.log(
|
Logging.instance.log(
|
||||||
"Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s",
|
"Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s",
|
||||||
level: LogLevel.Warning);
|
level: LogLevel.Warning,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: const QrCodeIcon(),
|
child: const QrCodeIcon(),
|
||||||
)
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -722,9 +793,9 @@ class _BuyFormState extends ConsumerState<BuyForm> {
|
||||||
enabled: ref.watch(
|
enabled: ref.watch(
|
||||||
exchangeFormStateProvider.select((value) => value.canExchange)),
|
exchangeFormStateProvider.select((value) => value.canExchange)),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
// TODO implement buy confirmation dialog
|
// preview buy quote
|
||||||
},
|
},
|
||||||
label: "Exchange",
|
label: "Preview quote",
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
45
pubspec.lock
45
pubspec.lock
|
@ -42,7 +42,7 @@ packages:
|
||||||
name: archive
|
name: archive
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.11"
|
version: "3.3.0"
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -63,7 +63,7 @@ packages:
|
||||||
name: async
|
name: async
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.8.2"
|
version: "2.9.0"
|
||||||
barcode_scan2:
|
barcode_scan2:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -190,14 +190,7 @@ packages:
|
||||||
name: characters
|
name: characters
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.0"
|
version: "1.2.1"
|
||||||
charcode:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: charcode
|
|
||||||
url: "https://pub.dartlang.org"
|
|
||||||
source: hosted
|
|
||||||
version: "1.3.1"
|
|
||||||
checked_yaml:
|
checked_yaml:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -218,7 +211,7 @@ packages:
|
||||||
name: clock
|
name: clock
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.1"
|
||||||
code_builder:
|
code_builder:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -288,7 +281,7 @@ packages:
|
||||||
name: coverage
|
name: coverage
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.0"
|
version: "1.5.0"
|
||||||
cross_file:
|
cross_file:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -442,7 +435,7 @@ packages:
|
||||||
name: fake_async
|
name: fake_async
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.0"
|
version: "1.3.1"
|
||||||
ffi:
|
ffi:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -871,21 +864,21 @@ packages:
|
||||||
name: matcher
|
name: matcher
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.12.11"
|
version: "0.12.12"
|
||||||
material_color_utilities:
|
material_color_utilities:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: material_color_utilities
|
name: material_color_utilities
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.4"
|
version: "0.1.5"
|
||||||
meta:
|
meta:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.7.0"
|
version: "1.8.0"
|
||||||
mime:
|
mime:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -997,7 +990,7 @@ packages:
|
||||||
name: path
|
name: path
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.1"
|
version: "1.8.2"
|
||||||
path_drawing:
|
path_drawing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1373,7 +1366,7 @@ packages:
|
||||||
name: source_span
|
name: source_span
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.2"
|
version: "1.9.0"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1417,7 +1410,7 @@ packages:
|
||||||
name: string_scanner
|
name: string_scanner
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.1"
|
||||||
string_validator:
|
string_validator:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -1431,35 +1424,35 @@ packages:
|
||||||
name: sync_http
|
name: sync_http
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.0"
|
version: "0.3.1"
|
||||||
term_glyph:
|
term_glyph:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: term_glyph
|
name: term_glyph
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.0"
|
version: "1.2.1"
|
||||||
test:
|
test:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test
|
name: test
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.21.1"
|
version: "1.21.4"
|
||||||
test_api:
|
test_api:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.4.9"
|
version: "0.4.12"
|
||||||
test_core:
|
test_core:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_core
|
name: test_core
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.4.13"
|
version: "0.4.16"
|
||||||
time:
|
time:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1508,7 +1501,7 @@ packages:
|
||||||
name: typed_data
|
name: typed_data
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.0"
|
version: "1.3.1"
|
||||||
universal_io:
|
universal_io:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1592,7 +1585,7 @@ packages:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.2.2"
|
version: "9.0.0"
|
||||||
wakelock:
|
wakelock:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
Loading…
Reference in a new issue