diff --git a/assets/images/clouds/top_hybrid.png b/assets/images/clouds/top_hybrid.png new file mode 100644 index 0000000..ac29060 Binary files /dev/null and b/assets/images/clouds/top_hybrid.png differ diff --git a/assets/images/money.png b/assets/images/money.png new file mode 100644 index 0000000..0447b4d Binary files /dev/null and b/assets/images/money.png differ diff --git a/lib/components/exchange_dialog.dart b/lib/components/exchange_dialog.dart new file mode 100644 index 0000000..dbca680 --- /dev/null +++ b/lib/components/exchange_dialog.dart @@ -0,0 +1,43 @@ +import "package:flutter/material.dart"; +import "package:flutter_gen/gen_l10n/app_localizations.dart"; +import "package:food_busters/styles/styles.dart"; + +AlertDialog exchangeSuccess(AppLocalizations text, BuildContext context) => + AlertDialog( + title: Text(text.exchange.toUpperCase(), textAlign: TextAlign.center), + backgroundColor: lightGreen, + content: Text(text.exchange_complete), + actions: [ + TextButton( + child: Text( + text.window_close, + style: const TextStyle( + color: Colors.black, + ), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + +AlertDialog exchangeFailed(AppLocalizations text, BuildContext context) => + AlertDialog( + title: Text(text.exchange.toUpperCase(), textAlign: TextAlign.center), + backgroundColor: rose, + content: Text(text.exchange_failed), + actions: [ + TextButton( + child: Text( + text.window_close, + style: const TextStyle( + color: Colors.black, + ), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 2263d62..334eb75 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -29,11 +29,16 @@ "after": "AFTER", "scan_your_food": "Scan your Food", "scan_result": "Scan Result", + "scan_before_title": "PERFECT!", + "scan_before_content": "Let's enjoy and don't forget to come back again after you finish eating.", + "back_to_home": "Back to Home Screen", "you_have_eaten": "You have eaten", "sp_only": " only", "of_the_dish": "of the dish", "oh_no": "Oh no!", "wow": "Wow!", + "save_money_1": "WOULD BE SAVED", + "save_money_2": "If you have eaten all.", "learn_more": "Learn more", "pollution_produced": "Pollution produced is {pollution} grams of CO2!", "points": "pts", @@ -51,6 +56,7 @@ "no_data_found": "Sorry, no data found", "exchange": "Exchange", "exchange_complete": "Completed! Time to enjoy.", + "exchange_failed": "Exchange Failed, Please verify you have enough points", "n_days_pass": "{n} days pass", "press_to_exchange": "Press to Exchange", "points_shop": "Points Shop", diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb index b47dc50..5934b25 100644 --- a/lib/l10n/app_th.arb +++ b/lib/l10n/app_th.arb @@ -27,6 +27,9 @@ "logout": "ล็อกเอาท์", "before": "ก่อนทาน", "after": "หลังทาน", + "scan_before_title": "สุดยอด!", + "scan_before_content": "ได้เวลาอร่อย! และอย่าลืมกลับมาอีกครั้งหลังทานเสร็จแล้ว", + "back_to_home": "กลับไปยังหน้าจอหลัก", "scan_your_food": "สแกนอาหารของคุณ", "scan_result": "ผลลัพธ์การสแกน", "you_have_eaten": "คุณได้กินไป", @@ -34,6 +37,8 @@ "of_the_dish": "ของทั้งจาน", "oh_no": "ไม่นะ!", "wow": "ว้าว", + "save_money_1": "คือเงินที่สามารถประหยัดได้", + "save_money_2": "ถ้าคุณได้กินอาหารหมดจาน", "learn_more": "เรียนรู้เพิ่มเติม", "pollution_produced": "มลพิษที่เกิดขึ้นคือคาร์บอนไดออกไซต์ {pollution} กรัม!", "points": "แต้ม", @@ -51,6 +56,7 @@ "no_data_found": "ขออภัย ไม่พบข้อมูลดังกล่าว", "exchange": "แลก", "exchange_complete": "สำเร็จ! ได้เวลาอร่อย", + "exchange_failed": "การแลกล้มเหลว โปรดตรวจสอบว่าคุณมีแต้มเพียงพอ", "n_days_pass": "{n} วัน", "press_to_exchange": "กดเพื่อแลก", "points_shop": "ร้านค้าแต้ม", diff --git a/lib/main.dart b/lib/main.dart index aaadecf..715993a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import "package:flutter/material.dart"; import "package:flutter/services.dart"; +import "package:food_busters/models/app_state.dart"; import "package:food_busters/views/login.dart"; import "package:flutter_localizations/flutter_localizations.dart"; import "package:flutter_gen/gen_l10n/app_localizations.dart"; @@ -35,12 +36,6 @@ class _MyAppState extends State { late String _localeStr; String get localeStrSimp => _localeStr.contains("th") ? "th" : "en"; - @override - void initState() { - super.initState(); - _localeStr = _locale.toString(); - } - void setLocale(String value) { setState(() { _localeStr = value; @@ -48,6 +43,14 @@ class _MyAppState extends State { }); } + final state = AppState(); + + @override + void initState() { + super.initState(); + _localeStr = _locale.toString(); + } + @override Widget build(BuildContext context) { return MaterialApp( diff --git a/lib/models/app_state.dart b/lib/models/app_state.dart new file mode 100644 index 0000000..3b6338d --- /dev/null +++ b/lib/models/app_state.dart @@ -0,0 +1,41 @@ +import "package:camera/camera.dart"; + +class AppState { + // * Image Part + XFile? _imageBefore; + XFile? _imageAfter; + + XFile? get imageBefore => _imageBefore; + bool get imageBeforeAvailable => _imageBefore != null; + XFile? get imageAfter => _imageAfter; + bool get imageAfterAvailable => _imageAfter != null; + bool get imageReady => imageBeforeAvailable && imageAfterAvailable; + + void setImageBefore(XFile image) { + _imageBefore = image; + } + + void deleteImageBefore() { + _imageBefore = null; + } + + void setImageAfter(XFile image) { + _imageAfter = image; + } + + // * Points Part + // ! Subjected to be change to server-based rather than local, ephemeral + int _points = 18; + + int get points => _points; + + void addPoints(int points) { + _points += points; + } + + bool usePoints(int points) { + if (_points < points) return false; + _points -= points; + return true; + } +} diff --git a/lib/styles/styles.dart b/lib/styles/styles.dart index eb8ef59..730ad03 100644 --- a/lib/styles/styles.dart +++ b/lib/styles/styles.dart @@ -17,3 +17,5 @@ const lightOrange = Color(0xFFFFC068); const lightGreen = Color(0xFFBBDFC8); const green = Color(0xFF5DC7AB); const tan = Color(0xFFF4E4D8); +const brown = Color(0xFF533F2C); +const rose = Color(0xFFF1D0C5); diff --git a/lib/views/points/exchange.dart b/lib/views/points/exchange.dart index bbc0799..c5588a2 100644 --- a/lib/views/points/exchange.dart +++ b/lib/views/points/exchange.dart @@ -1,7 +1,10 @@ import "package:flutter/material.dart"; import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:food_busters/components/background.dart"; +import "package:food_busters/components/exchange_dialog.dart"; import "package:food_busters/data/dummy_restaurant.dart"; +import "package:food_busters/main.dart"; +import "package:food_busters/models/app_state.dart"; import "package:food_busters/models/restaurant_menu.dart"; import "package:food_busters/styles/styles.dart"; import "package:food_busters/utils/string.dart"; @@ -21,6 +24,7 @@ class _ExchangePageState extends State { @override Widget build(BuildContext context) { final text = AppLocalizations.of(context)!; + final appState = MyApp.of(context).state; return Scaffold( backgroundColor: const Color(0xFFF4E4D8), @@ -33,7 +37,7 @@ class _ExchangePageState extends State { Center( child: Padding( padding: const EdgeInsets.all(16.0), - child: Text("18 ${text.points}"), + child: Text("${appState.points} ${text.points}"), ), ), ], @@ -62,7 +66,7 @@ class _ExchangePageState extends State { return Padding( padding: const EdgeInsets.symmetric(vertical: 30.0), child: data.isNotEmpty - ? foodList(data, text) + ? foodList(data, text, appState) : Center( child: Text( text.no_data_found, @@ -83,7 +87,11 @@ class _ExchangePageState extends State { ); } - Widget foodList(List data, AppLocalizations text) => + Widget foodList( + List data, + AppLocalizations text, + AppState state, + ) => ListView.builder( itemCount: data.length, itemBuilder: (context, index) { @@ -148,27 +156,12 @@ class _ExchangePageState extends State { showDialog( context: context, builder: (context) { - // * Do Something - return AlertDialog( - title: Text(text.exchange.toUpperCase()), - content: Text(text.exchange_complete), - backgroundColor: const Color(0xFFBBDFC8), - actions: [ - TextButton( - child: Text( - text.window_close, - style: const TextStyle( - color: Colors.black, - ), - ), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); + return state.usePoints(res.price) + ? exchangeSuccess(text, context) + : exchangeFailed(text, context); }, ); + setState(() {}); }, child: Text(text.exchange), ), diff --git a/lib/views/points/points.dart b/lib/views/points/points.dart index f43514b..52b32cb 100644 --- a/lib/views/points/points.dart +++ b/lib/views/points/points.dart @@ -2,6 +2,9 @@ import "package:flutter/material.dart"; import "package:flutter_toggle_tab/flutter_toggle_tab.dart"; import "package:food_busters/components/background.dart"; import "package:flutter_gen/gen_l10n/app_localizations.dart"; +import "package:food_busters/components/exchange_dialog.dart"; +import "package:food_busters/main.dart"; +import "package:food_busters/models/app_state.dart"; import "package:food_busters/styles/styles.dart"; import "package:food_busters/views/points/exchange.dart"; import "package:food_busters/views/points/points_shop.dart"; @@ -22,6 +25,7 @@ class _MyPointsState extends State { @override Widget build(BuildContext context) { final text = AppLocalizations.of(context)!; + final appState = MyApp.of(context).state; return Scaffold( backgroundColor: tan, @@ -32,11 +36,12 @@ class _MyPointsState extends State { elevation: 0, actions: [ TextButton( - onPressed: () { - Navigator.push( + onPressed: () async { + await Navigator.push( context, MaterialPageRoute(builder: (context) => const PointsShopPage()), ); + setState(() {}); }, child: const Icon(Icons.attach_money, color: green), ) @@ -64,12 +69,12 @@ class _MyPointsState extends State { ), child: Column( children: [ - const Text( - "18", - style: TextStyle( - fontSize: 100, + Text( + appState.points.toString(), + style: const TextStyle( + fontSize: 64, fontWeight: FontWeight.w500, - height: 1.2, + height: 1.6, ), ), Text( @@ -110,8 +115,9 @@ class _MyPointsState extends State { Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), - child: - _panel ? exchangePremiumPanel(text) : promotionPanel(text), + child: _panel + ? exchangePremiumPanel(text, appState) + : promotionPanel(text), ), ], ), @@ -140,8 +146,8 @@ class _MyPointsState extends State { ], ), style: tanBtn, - onPressed: () { - Navigator.push( + onPressed: () async { + await Navigator.push( context, MaterialPageRoute( builder: (context) => ExchangePage( @@ -149,6 +155,7 @@ class _MyPointsState extends State { ), ), ); + setState(() {}); }, ), ), @@ -202,11 +209,10 @@ class _MyPointsState extends State { ElevatedButton.styleFrom(primary: lightOrange), ), ElevatedButton( - onPressed: () { + onPressed: () async { if (formKey.currentState?.validate() ?? false) { formKey.currentState?.save(); - Navigator.of(context).pop(); - Navigator.push( + await Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => ExchangePage( @@ -215,6 +221,7 @@ class _MyPointsState extends State { ), ), ); + setState(() {}); } }, child: Text(text.confirm), @@ -231,7 +238,8 @@ class _MyPointsState extends State { ), ); - Widget exchangePremiumPanel(AppLocalizations text) => Container( + Widget exchangePremiumPanel(AppLocalizations text, AppState state) => + Container( decoration: BoxDecoration( color: lightGreen, borderRadius: BorderRadius.circular(10.0), @@ -249,8 +257,11 @@ class _MyPointsState extends State { onPressed: () { showDialog( context: context, - builder: (context) => exchangeSuccess(text, context), + builder: (context) => state.usePoints(150) + ? exchangeSuccess(text, context) + : exchangeFailed(text, context), ); + setState(() {}); }, ), ), @@ -263,8 +274,11 @@ class _MyPointsState extends State { onPressed: () { showDialog( context: context, - builder: (context) => exchangeSuccess(text, context), + builder: (context) => state.usePoints(299) + ? exchangeSuccess(text, context) + : exchangeFailed(text, context), ); + setState(() {}); }, ), ), @@ -295,24 +309,4 @@ class _MyPointsState extends State { Text(text.press_to_exchange), ], ); - - AlertDialog exchangeSuccess(AppLocalizations text, BuildContext context) => - AlertDialog( - title: Text(text.exchange.toUpperCase(), textAlign: TextAlign.center), - backgroundColor: lightGreen, - content: Text(text.exchange_complete), - actions: [ - TextButton( - child: Text( - text.window_close, - style: const TextStyle( - color: Colors.black, - ), - ), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); } diff --git a/lib/views/points/points_shop.dart b/lib/views/points/points_shop.dart index 9bbfc7d..26c6764 100644 --- a/lib/views/points/points_shop.dart +++ b/lib/views/points/points_shop.dart @@ -2,6 +2,7 @@ import "package:flutter/material.dart"; import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:food_busters/components/background.dart"; import "package:food_busters/data/dummy_points.dart"; +import "package:food_busters/main.dart"; import "package:food_busters/models/points_price.dart"; import "package:food_busters/styles/styles.dart"; @@ -16,6 +17,7 @@ class _PointsShopPageState extends State { @override Widget build(BuildContext context) { final text = AppLocalizations.of(context)!; + final appState = MyApp.of(context).state; return Scaffold( backgroundColor: tan, @@ -63,6 +65,7 @@ class _PointsShopPageState extends State { ), ElevatedButton( onPressed: () { + appState.addPoints(menu.points); showDialog( context: context, builder: (context) => AlertDialog( diff --git a/lib/views/scan/scanafter.dart b/lib/views/scan/scanafter.dart index 9e5cc2c..13cb5a7 100644 --- a/lib/views/scan/scanafter.dart +++ b/lib/views/scan/scanafter.dart @@ -1,4 +1,3 @@ -import "package:camera/camera.dart"; import "package:flutter/material.dart"; import "package:food_busters/components/background.dart"; import "package:food_busters/main.dart"; @@ -11,9 +10,7 @@ import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "dart:math"; class ScanAfterPage extends StatefulWidget { - const ScanAfterPage({Key? key, required this.image}) : super(key: key); - - final XFile image; + const ScanAfterPage({Key? key}) : super(key: key); @override _ScanAfterPageState createState() => _ScanAfterPageState(); @@ -27,7 +24,12 @@ class _ScanAfterPageState extends State { int percent = 0; - Future getQuote() async { + Future getAnalysis(BuildContext context) async { + final appState = MyApp.of(context).state; + if (!appState.imageReady) { + return "Image lost in state"; + } + // * SIMULATE IMAGE PROCESSING await Future.delayed(const Duration(milliseconds: 500)); percent = Random().nextInt(100) + 1; @@ -62,37 +64,18 @@ class _ScanAfterPageState extends State { bgImage("clouds/top_orange.png"), Center( child: FutureBuilder( - future: getQuote(), + future: getAnalysis(context), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { - final isBad = percent < 80; - final quote = snapshot.data ?? "Impossible Error"; - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "${(percent * percent / 100).floor()} ${text.points}", - style: const TextStyle( - color: green, - fontSize: 30, - fontWeight: FontWeight.w500, - ), - ), - Text( - "${text.you_have_eaten}" - "${percent < 40 ? text.sp_only : ""} " - "$percent% ${text.of_the_dish}...", - ), - Text( - isBad ? text.oh_no : text.wow, - style: const TextStyle(fontSize: 28), - ), - Text( - quote, - style: const TextStyle(fontSize: 24, color: green), - textAlign: TextAlign.center, - ), - ], + final quote = snapshot.data ?? "Internal Flutter Error"; + return DefaultTabController( + length: 2, + child: TabBarView( + children: [ + infoPage1(text, quote), + infoPage2(text), + ], + ), ); } return const CircularProgressIndicator(); @@ -107,4 +90,60 @@ class _ScanAfterPageState extends State { ), ); } + + Widget infoPage1(AppLocalizations text, String quote) => Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "${(percent * percent / 100).floor()} ${text.points}", + style: const TextStyle( + color: green, + fontSize: 30, + fontWeight: FontWeight.w500, + ), + ), + Text( + "${text.you_have_eaten}" + "${percent < 40 ? text.sp_only : ""} " + "$percent% ${text.of_the_dish}...", + ), + Text( + percent < 80 ? text.oh_no : text.wow, + style: const TextStyle(fontSize: 28), + ), + Text( + quote, + style: const TextStyle(fontSize: 24, color: green), + textAlign: TextAlign.center, + ), + ], + ); + + Widget infoPage2(AppLocalizations text) => Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset("assets/images/money.png", width: 150, height: 150), + Text( + "${50 - percent / 2} THB", + style: const TextStyle( + color: green, + fontSize: 26, + fontWeight: FontWeight.w500, + ), + ), + Text( + text.save_money_1, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w500, + ), + ), + Text( + text.save_money_2, + style: const TextStyle( + fontSize: 18, + ), + ), + ], + ); } diff --git a/lib/views/scan/scanbefore.dart b/lib/views/scan/scanbefore.dart index 5ab1408..5dc457d 100644 --- a/lib/views/scan/scanbefore.dart +++ b/lib/views/scan/scanbefore.dart @@ -1,11 +1,10 @@ -import "package:camera/camera.dart"; import "package:flutter/material.dart"; import "package:flutter_gen/gen_l10n/app_localizations.dart"; +import "package:food_busters/components/background.dart"; +import "package:food_busters/styles/styles.dart"; class ScanBeforePage extends StatefulWidget { - const ScanBeforePage({Key? key, required this.image}) : super(key: key); - - final XFile image; + const ScanBeforePage({Key? key}) : super(key: key); @override _ScanBeforePageState createState() => _ScanBeforePageState(); @@ -18,11 +17,50 @@ class _ScanBeforePageState extends State { return Scaffold( extendBodyBehindAppBar: true, + backgroundColor: brown, appBar: AppBar( - title: Text(text.scan_result), backgroundColor: Colors.transparent, elevation: 0, ), + body: Stack( + children: [ + bgImage("clouds/top_hybrid.png"), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + text.scan_before_title, + style: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: 32, + color: Colors.white, + ), + ), + Padding( + padding: const EdgeInsets.all(24.0), + child: Text( + text.scan_before_content, + style: const TextStyle( + color: Colors.white, + fontSize: 24, + ), + textAlign: TextAlign.center, + ), + ), + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text( + text.back_to_home, + style: const TextStyle(fontSize: 18), + ), + style: loginRegisterBtn, + ), + ], + ), + ], + ), ); } } diff --git a/lib/views/scan/scanfood.dart b/lib/views/scan/scanfood.dart index 9685f79..aa37736 100644 --- a/lib/views/scan/scanfood.dart +++ b/lib/views/scan/scanfood.dart @@ -1,6 +1,7 @@ import "package:camera/camera.dart"; import "package:flutter/material.dart"; import "package:food_busters/components/background.dart"; +import "package:food_busters/main.dart"; import "package:food_busters/views/scan/scanafter.dart"; import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:food_busters/views/scan/scanbefore.dart"; @@ -41,6 +42,7 @@ class _ScanPageState extends State { @override Widget build(BuildContext context) { final text = AppLocalizations.of(context)!; + final appState = MyApp.of(context).state; return Scaffold( extendBodyBehindAppBar: true, @@ -66,13 +68,16 @@ class _ScanPageState extends State { ? () async { if (controller.value.isTakingPicture) return; final XFile image = await controller.takePicture(); + widget.destination == scanDestination.before + ? appState.setImageBefore(image) + : appState.setImageAfter(image); Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => widget.destination == scanDestination.before - ? ScanBeforePage(image: image) - : ScanAfterPage(image: image), + ? const ScanBeforePage() + : const ScanAfterPage(), ), ); } diff --git a/lib/views/scan/scanportal.dart b/lib/views/scan/scanportal.dart index 690678d..efe900e 100644 --- a/lib/views/scan/scanportal.dart +++ b/lib/views/scan/scanportal.dart @@ -2,6 +2,7 @@ import "package:camera/camera.dart"; import "package:flutter/material.dart"; import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:food_busters/components/background.dart"; +import "package:food_busters/main.dart"; import "package:food_busters/styles/styles.dart"; import "package:food_busters/views/scan/scanfood.dart"; @@ -23,8 +24,7 @@ class _ScanPortalPageState extends State { scanDestination destination, ) async { final cameras = await availableCameras(); - Navigator.of(context).pop(); - Navigator.push( + Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => ScanPage( @@ -38,6 +38,7 @@ class _ScanPortalPageState extends State { @override Widget build(BuildContext context) { final text = AppLocalizations.of(context)!; + final appState = MyApp.of(context).state; return Scaffold( extendBodyBehindAppBar: true, @@ -54,24 +55,44 @@ class _ScanPortalPageState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - ElevatedButton( - onPressed: () { - goToScanPage(context, scanDestination.before); - }, - child: Text( - text.before, - style: const TextStyle(fontSize: 24), - ), - style: ElevatedButton.styleFrom( - primary: lightOrange, - padding: const EdgeInsets.all(8.0), - ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + onPressed: appState.imageBeforeAvailable + ? null + : () { + goToScanPage(context, scanDestination.before); + }, + child: Text( + text.before, + style: const TextStyle(fontSize: 24), + ), + style: ElevatedButton.styleFrom( + primary: lightOrange, + padding: const EdgeInsets.all(8.0), + ), + ), + const SizedBox(width: 16), + ElevatedButton( + onPressed: appState.imageBeforeAvailable + ? () { + setState(() { + appState.deleteImageBefore(); + }); + } + : null, + child: const Icon(Icons.delete), + ), + ], ), const SizedBox(height: 48), ElevatedButton( - onPressed: () { - goToScanPage(context, scanDestination.after); - }, + onPressed: appState.imageBeforeAvailable + ? () { + goToScanPage(context, scanDestination.after); + } + : null, child: Text( text.after, style: const TextStyle(fontSize: 24), diff --git a/pubspec.yaml b/pubspec.yaml index 873b1e2..134c09f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.80 +version: 1.0.100 environment: sdk: ">=2.12.0 <3.0.0" @@ -76,6 +76,7 @@ flutter: - assets/images/loading.png - assets/images/logo_white.jpg - assets/images/leaf.png + - assets/images/money.png - assets/images/clouds/ # An image asset can refer to one or more resolution-specific "variants", see