From 9e17cf0f1cc1fb7f6cb6acf3014a055dad25955c Mon Sep 17 00:00:00 2001 From: Piyush <40383768+Piyushhhhh@users.noreply.github.com> Date: Sun, 16 Jul 2023 16:01:40 +0530 Subject: [PATCH] added providers for state management --- lib/constants/strings.dart | 3 + lib/data/api/config/api_config.dart | 3 + .../medical_consultation_service.dart | 3 + lib/data/api/service/remote_api_service.dart | 1 + .../provider/conversation_provider.dart | 20 +++ .../screens/conversation_screen.dart | 19 ++- .../widgets/conversation_list.dart | 11 +- .../provider/dashboard_provider.dart | 49 ++++++++ .../dashboard/screens/dashboard_screen.dart | 61 ++++++--- .../dashboard/widgets/appointment_card.dart | 5 +- .../dashboard/widgets/appointments.dart | 8 +- .../dashboard/widgets/top_doctors.dart | 19 +-- .../shared/enums/base_notifier_status.dart | 10 ++ .../shared/notifiers/base_notifier.dart | 116 ++++++++++++++++++ .../shared/notifiers/base_provider.dart | 63 ++++++++++ .../shared/widgets/error_snack_bar.dart | 16 +++ pubspec.lock | 19 ++- pubspec.yaml | 71 +---------- 18 files changed, 382 insertions(+), 115 deletions(-) create mode 100644 lib/data/api/config/api_config.dart create mode 100644 lib/data/api/implementation/medical_consultation_service.dart create mode 100644 lib/data/api/service/remote_api_service.dart create mode 100644 lib/features/conversations/provider/conversation_provider.dart create mode 100644 lib/features/dashboard/provider/dashboard_provider.dart create mode 100644 lib/features/shared/enums/base_notifier_status.dart create mode 100644 lib/features/shared/notifiers/base_notifier.dart create mode 100644 lib/features/shared/notifiers/base_provider.dart create mode 100644 lib/features/shared/widgets/error_snack_bar.dart diff --git a/lib/constants/strings.dart b/lib/constants/strings.dart index b9f4006..c7bbc6e 100644 --- a/lib/constants/strings.dart +++ b/lib/constants/strings.dart @@ -24,4 +24,7 @@ class Strings { static const String showMore = "show more"; static const String showLess = "show less"; static const String selectSchedule = "Select Schedule"; + + static const String defaultErrorMessage = + 'An error occurred while loading data'; } diff --git a/lib/data/api/config/api_config.dart b/lib/data/api/config/api_config.dart new file mode 100644 index 0000000..7f73fa9 --- /dev/null +++ b/lib/data/api/config/api_config.dart @@ -0,0 +1,3 @@ +class ApiConfig { + static const String baseUrl = ''; +} diff --git a/lib/data/api/implementation/medical_consultation_service.dart b/lib/data/api/implementation/medical_consultation_service.dart new file mode 100644 index 0000000..027a8b6 --- /dev/null +++ b/lib/data/api/implementation/medical_consultation_service.dart @@ -0,0 +1,3 @@ +import 'package:medical_consultation/data/api/service/remote_api_service.dart'; + +class MedicalConsultationService implements RemoteApiService {} diff --git a/lib/data/api/service/remote_api_service.dart b/lib/data/api/service/remote_api_service.dart new file mode 100644 index 0000000..3771a83 --- /dev/null +++ b/lib/data/api/service/remote_api_service.dart @@ -0,0 +1 @@ +abstract class RemoteApiService {} diff --git a/lib/features/conversations/provider/conversation_provider.dart b/lib/features/conversations/provider/conversation_provider.dart new file mode 100644 index 0000000..488fd9e --- /dev/null +++ b/lib/features/conversations/provider/conversation_provider.dart @@ -0,0 +1,20 @@ +import 'package:medical_consultation/constants/strings.dart'; +import 'package:medical_consultation/data/mock_data/conversation.dart'; +import 'package:medical_consultation/features/shared/notifiers/base_notifier.dart'; +import 'package:medical_consultation/models/conversation.dart'; + +class ConversationProvider extends BaseNotifier { + List userCurrentConversations = []; + Future featchUserCurrentConversation() async { + try { + sendLoading(); + userCurrentConversations = userConversations; + sendSuccess(); + } on Error catch (error) { + sendError(message: error.toString()); + } catch (_) { + sendError(message: Strings.defaultErrorMessage); + rethrow; + } + } +} diff --git a/lib/features/conversations/screens/conversation_screen.dart b/lib/features/conversations/screens/conversation_screen.dart index b2f2ded..4bf6fc3 100644 --- a/lib/features/conversations/screens/conversation_screen.dart +++ b/lib/features/conversations/screens/conversation_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:medical_consultation/constants/colors.dart'; +import 'package:medical_consultation/features/conversations/provider/conversation_provider.dart'; import 'package:medical_consultation/features/conversations/widgets/conversation_app_bar.dart'; import 'package:medical_consultation/features/conversations/widgets/conversation_list.dart'; import 'package:medical_consultation/features/conversations/widgets/search_conversation.dart'; @@ -12,6 +13,13 @@ class ConversationScreen extends StatefulWidget { } class _ConversationScreenState extends State { + ConversationProvider conversationProvider = ConversationProvider(); + @override + void initState() { + Future.wait([conversationProvider.featchUserCurrentConversation()]); + super.initState(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -21,12 +29,15 @@ class _ConversationScreenState extends State { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Column( - children: const [ - SearchConversation(), - SizedBox( + children: [ + const SearchConversation(), + const SizedBox( height: 10, ), - ConversationListWidget(), + ConversationListWidget( + userConversations: + conversationProvider.userCurrentConversations, + ), ], ), ), diff --git a/lib/features/conversations/widgets/conversation_list.dart b/lib/features/conversations/widgets/conversation_list.dart index 5fe1e60..1dbd52b 100644 --- a/lib/features/conversations/widgets/conversation_list.dart +++ b/lib/features/conversations/widgets/conversation_list.dart @@ -1,16 +1,13 @@ import 'package:flutter/material.dart'; import 'package:medical_consultation/constants/colors.dart'; import 'package:medical_consultation/constants/text_styles.dart'; -import 'package:medical_consultation/data/mock_data/conversation.dart'; +import 'package:medical_consultation/models/conversation.dart'; -class ConversationListWidget extends StatefulWidget { - const ConversationListWidget({super.key}); +class ConversationListWidget extends StatelessWidget { + final List userConversations; - @override - State createState() => _ConversationListWidgetState(); -} + const ConversationListWidget({super.key, required this.userConversations}); -class _ConversationListWidgetState extends State { @override Widget build(BuildContext context) { return ListView.builder( diff --git a/lib/features/dashboard/provider/dashboard_provider.dart b/lib/features/dashboard/provider/dashboard_provider.dart new file mode 100644 index 0000000..171ca5a --- /dev/null +++ b/lib/features/dashboard/provider/dashboard_provider.dart @@ -0,0 +1,49 @@ +import 'package:medical_consultation/constants/strings.dart'; +import 'package:medical_consultation/data/mock_data/appointments_mock.dart'; +import 'package:medical_consultation/data/mock_data/recomended_doctor_mock.dart'; +import 'package:medical_consultation/features/shared/notifiers/base_notifier.dart'; +import 'package:medical_consultation/models/appointment.dart'; +import 'package:medical_consultation/models/doctor_details.dart'; + +class DashboardProvider extends BaseNotifier { + List topRecomendedDoctor = []; + List userCurrentAppointment = []; + + Future init() async { + try { + fetchRecomendedDoctor(); + userAppointments(); + } on Error catch (error) { + sendError(message: error.toString()); + } catch (_) { + sendError(message: Strings.defaultErrorMessage); + rethrow; + } + } + + Future fetchRecomendedDoctor() async { + try { + sendLoading(); + topRecomendedDoctor = recomendedDoctor; + sendSuccess(); + } on Error catch (error) { + sendError(message: error.toString()); + } catch (_) { + sendError(message: Strings.defaultErrorMessage); + rethrow; + } + } + + Future userAppointments() async { + try { + sendLoading(); + userCurrentAppointment = userAppointment; + sendSuccess(); + } on Error catch (error) { + sendError(message: error.toString()); + } catch (_) { + sendError(message: Strings.defaultErrorMessage); + rethrow; + } + } +} diff --git a/lib/features/dashboard/screens/dashboard_screen.dart b/lib/features/dashboard/screens/dashboard_screen.dart index 1947fe0..778f244 100644 --- a/lib/features/dashboard/screens/dashboard_screen.dart +++ b/lib/features/dashboard/screens/dashboard_screen.dart @@ -1,9 +1,13 @@ import 'package:flutter/material.dart'; +import 'package:medical_consultation/features/dashboard/provider/dashboard_provider.dart'; import 'package:medical_consultation/features/dashboard/widgets/appointments.dart'; import 'package:medical_consultation/features/dashboard/widgets/dashboard_title.dart'; import 'package:medical_consultation/features/dashboard/widgets/search_consultion.dart'; import 'package:medical_consultation/features/dashboard/widgets/top_buttons.dart'; import 'package:medical_consultation/features/dashboard/widgets/top_doctors.dart'; +import 'package:medical_consultation/features/shared/notifiers/base_provider.dart'; +import 'package:medical_consultation/features/shared/widgets/error_snack_bar.dart'; +import 'package:provider/provider.dart'; class DashboardScreen extends StatefulWidget { const DashboardScreen({super.key}); @@ -14,25 +18,48 @@ class DashboardScreen extends StatefulWidget { class _DashboardScreenState extends State { TextEditingController searchController = TextEditingController(); + DashboardProvider dashboardProvider = DashboardProvider(); + @override + void initState() { + Future.wait([dashboardProvider.init()]); + super.initState(); + } + @override Widget build(BuildContext context) { - return SafeArea( - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(10.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: const [ - DashboardTitle(), - SearchConsultaionField(), - TopButtons(), - AppointmentDashboardWidget(), - TopDoctors(), - ], - ), - ), - ), + return BaseProvider.value( + value: dashboardProvider, + onError: (notifier, message) => + buildErrorSnackBar(context, message: message), + builder: (context, child) { + return Consumer( + builder: (context, provider, child) { + return SafeArea( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const DashboardTitle(), + const SearchConsultaionField(), + const TopButtons(), + AppointmentDashboardWidget( + userAppointment: + dashboardProvider.userCurrentAppointment, + ), + TopDoctors( + topDoctors: dashboardProvider.topRecomendedDoctor, + ), + ], + ), + ), + ), + ); + }, + ); + }, ); } } diff --git a/lib/features/dashboard/widgets/appointment_card.dart b/lib/features/dashboard/widgets/appointment_card.dart index e821708..7e29a94 100644 --- a/lib/features/dashboard/widgets/appointment_card.dart +++ b/lib/features/dashboard/widgets/appointment_card.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; import 'package:medical_consultation/constants/colors.dart'; import 'package:medical_consultation/constants/text_styles.dart'; -import 'package:medical_consultation/data/mock_data/appointments_mock.dart'; +import 'package:medical_consultation/models/appointment.dart'; class AppionmentStackCard extends StatelessWidget { - const AppionmentStackCard({super.key}); + final List userAppointment; + const AppionmentStackCard({super.key, required this.userAppointment}); @override Widget build(BuildContext context) { diff --git a/lib/features/dashboard/widgets/appointments.dart b/lib/features/dashboard/widgets/appointments.dart index f6ee7b2..4815342 100644 --- a/lib/features/dashboard/widgets/appointments.dart +++ b/lib/features/dashboard/widgets/appointments.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:medical_consultation/constants/strings.dart'; import 'package:medical_consultation/constants/text_styles.dart'; import 'package:medical_consultation/features/dashboard/widgets/appointment_card.dart'; +import 'package:medical_consultation/models/appointment.dart'; class AppointmentDashboardWidget extends StatelessWidget { - const AppointmentDashboardWidget({super.key}); + final List userAppointment; + const AppointmentDashboardWidget({super.key, required this.userAppointment}); @override Widget build(BuildContext context) { @@ -30,7 +32,9 @@ class AppointmentDashboardWidget extends StatelessWidget { const SizedBox( height: 10, ), - const AppionmentStackCard(), + AppionmentStackCard( + userAppointment: userAppointment, + ), ], ); } diff --git a/lib/features/dashboard/widgets/top_doctors.dart b/lib/features/dashboard/widgets/top_doctors.dart index 1aa2126..6f57187 100644 --- a/lib/features/dashboard/widgets/top_doctors.dart +++ b/lib/features/dashboard/widgets/top_doctors.dart @@ -2,11 +2,12 @@ import 'package:flutter/material.dart'; import 'package:medical_consultation/constants/colors.dart'; import 'package:medical_consultation/constants/strings.dart'; import 'package:medical_consultation/constants/text_styles.dart'; -import 'package:medical_consultation/data/mock_data/recomended_doctor_mock.dart'; import 'package:medical_consultation/features/dashboard/screens/doctor_details_screen.dart'; +import 'package:medical_consultation/models/doctor_details.dart'; class TopDoctors extends StatelessWidget { - const TopDoctors({super.key}); + final List topDoctors; + const TopDoctors({super.key, required this.topDoctors}); @override Widget build(BuildContext context) { @@ -30,7 +31,7 @@ class TopDoctors extends StatelessWidget { height: 10, ), ListView.builder( - itemCount: recomendedDoctor.length, + itemCount: topDoctors.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, index) { @@ -40,7 +41,7 @@ class TopDoctors extends StatelessWidget { context, MaterialPageRoute( builder: (_) => DoctorDetailsScreen( - doctorDetail: recomendedDoctor[index], + doctorDetail: topDoctors[index], ), ), ); @@ -58,7 +59,7 @@ class TopDoctors extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.network( - recomendedDoctor[index].imageUrl ?? '', + topDoctors[index].imageUrl ?? '', ), const SizedBox( width: 10, @@ -68,14 +69,14 @@ class TopDoctors extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '${recomendedDoctor[index].specialty ?? ''} ${Strings.specialist}', + '${topDoctors[index].specialty ?? ''} ${Strings.specialist}', style: TextStyles.regular16.withFadeText(), ), const SizedBox( height: 5, ), Text( - 'dr. ${recomendedDoctor[index].name ?? ''}', + 'dr. ${topDoctors[index].name ?? ''}', style: TextStyles.semibold22.textColor(), ), const SizedBox( @@ -91,7 +92,7 @@ class TopDoctors extends StatelessWidget { width: 2, ), Text( - (recomendedDoctor[index].rating ?? '').toString(), + (topDoctors[index].rating ?? '').toString(), style: TextStyles.regular16.textColor(), ), const SizedBox( @@ -105,7 +106,7 @@ class TopDoctors extends StatelessWidget { width: 5, ), Text( - '${recomendedDoctor[index].numberOfReviews ?? ''} ${Strings.reviews}', + '${topDoctors[index].numberOfReviews ?? ''} ${Strings.reviews}', style: TextStyles.regular16.textColor(), ), ], diff --git a/lib/features/shared/enums/base_notifier_status.dart b/lib/features/shared/enums/base_notifier_status.dart new file mode 100644 index 0000000..74eb151 --- /dev/null +++ b/lib/features/shared/enums/base_notifier_status.dart @@ -0,0 +1,10 @@ +enum BaseNotifierStatus { + init, + error, + success, + loading, + + cancel, + disconnected, + loaded, +} \ No newline at end of file diff --git a/lib/features/shared/notifiers/base_notifier.dart b/lib/features/shared/notifiers/base_notifier.dart new file mode 100644 index 0000000..6ef5160 --- /dev/null +++ b/lib/features/shared/notifiers/base_notifier.dart @@ -0,0 +1,116 @@ +import 'dart:developer'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:medical_consultation/constants/strings.dart'; +import 'package:medical_consultation/features/shared/enums/base_notifier_status.dart'; + +class BaseNotifier extends ChangeNotifier { + bool disposed = false; + Function(BaseNotifier notifier)? onSuccess; + Function(BaseNotifier notifier, String? message)? onError; + BaseNotifierStatus _status = BaseNotifierStatus.init; + + BaseNotifierStatus get status => _status; + + bool get isSuccess => _status == BaseNotifierStatus.success; + + bool get isFailed => _status == BaseNotifierStatus.error; + + bool get isLoading => _status == BaseNotifierStatus.loading; + + bool get isInit => _status == BaseNotifierStatus.init; + + @protected + void resetState({bool notify = false}) { + if (disposed) { + return; + } + + _status = BaseNotifierStatus.init; + + if (notify) { + notifyListeners(); + } + } + + @protected + void sendSuccess({bool notify = true}) { + if (disposed) { + return; + } + + _status = BaseNotifierStatus.success; + + onSuccess?.call(this); + + if (notify) { + notifyListeners(); + } + } + + @protected + void sendError({bool notify = true, String? message}) { + if (disposed) { + return; + } + + _status = BaseNotifierStatus.error; + + onError?.call(this, message); + + if (notify) { + notifyListeners(); + } + } + + @protected + void sendLoading({bool notify = true}) { + if (disposed) { + return; + } + + _status = BaseNotifierStatus.loading; + + if (notify) { + notifyListeners(); + } + } + + @protected + void sendEvent({required BaseNotifierStatus status, bool notify = true}) { + if (disposed) { + return; + } + + _status = status; + + if (notify) { + notifyListeners(); + } + } + + @override + void dispose() { + disposed = true; + super.dispose(); + } + + Future callApiMethod(Future future, + {Function(T)? onSuccess, Function(String?)? onError}) async { + try { + var response = await future; + log('On response.'); + onSuccess?.call(response); + sendSuccess(); + } on HttpException catch (error) { + log('On error.'); + onError?.call(error.message); + sendError(message: error.message); + } catch (_) { + log('On error 2.'); + onError?.call(Strings.defaultErrorMessage); + rethrow; + } + } +} diff --git a/lib/features/shared/notifiers/base_provider.dart b/lib/features/shared/notifiers/base_provider.dart new file mode 100644 index 0000000..f119992 --- /dev/null +++ b/lib/features/shared/notifiers/base_provider.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:medical_consultation/features/shared/notifiers/base_notifier.dart'; +import 'package:provider/provider.dart'; + +class BaseProvider extends ChangeNotifierProvider { + final Function(BaseNotifier notifier)? onSuccess; + final Function(BaseNotifier notifier, String? message)? onError; + + BaseProvider({ + Key? key, + required Create create, + bool? lazy, + TransitionBuilder? builder, + Widget? child, + this.onSuccess, + this.onError, + }) : super( + key: key, + create: create, + lazy: lazy, + builder: builder, + child: child, + ); + + BaseProvider.value({ + Key? key, + required T value, + this.onSuccess, + this.onError, + TransitionBuilder? builder, + Widget? child, + }) : super.value( + key: key, + builder: builder, + value: value, + child: child, + ) { + value?.onSuccess = onSuccess; + value?.onError = onError; + } + + BaseProvider.consumer({ + Key? key, + required T value, + this.onSuccess, + this.onError, + TransitionBuilder? transitionBuilder, + required Widget Function( + BuildContext context, + T value, + Widget? child, + ) + builder, + }) : super.value( + key: key, + builder: transitionBuilder, + value: value, + child: Consumer(builder: builder), + ) { + value?.onSuccess = onSuccess; + value?.onError = onError; + } +} diff --git a/lib/features/shared/widgets/error_snack_bar.dart b/lib/features/shared/widgets/error_snack_bar.dart new file mode 100644 index 0000000..720e5df --- /dev/null +++ b/lib/features/shared/widgets/error_snack_bar.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:medical_consultation/constants/colors.dart'; +import 'package:medical_consultation/constants/text_styles.dart'; + +buildErrorSnackBar(BuildContext context, {String? message}) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + behavior: SnackBarBehavior.floating, + content: Text( + message ?? 'Unknown error', + style: TextStyles.semibold16.textColor(), + ), + backgroundColor: AppColors.negative(), + ), + ); +} diff --git a/pubspec.lock b/pubspec.lock index 13379ff..8610333 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -115,14 +115,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.0" - mobx: - dependency: "direct main" + nested: + dependency: transitive description: - name: mobx - sha256: "0afcf88b3ee9d6819890bf16c11a727fc8c62cf736fda8e5d3b9b4eace4e62ea" + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "1.0.0" path: dependency: transitive description: @@ -131,6 +131,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.2" + provider: + dependency: "direct main" + description: + name: provider + sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + url: "https://pub.dev" + source: hosted + version: "6.0.5" sky_engine: dependency: transitive description: flutter @@ -194,3 +202,4 @@ packages: version: "2.1.4" sdks: dart: ">=2.19.6 <3.0.0" + flutter: ">=1.16.0" diff --git a/pubspec.yaml b/pubspec.yaml index 68c8ba3..5fd2eb3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,88 +4,21 @@ description: A new Flutter project. # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. version: 1.0.0+1 environment: sdk: '>=2.19.6 <3.0.0' - -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter - - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 - mobx: ^2.2.0 + provider: ^6.0.1 dev_dependencies: flutter_test: sdk: flutter - - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. flutter_lints: ^2.0.0 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. uses-material-design: true - - # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/assets-and-images/#from-packages - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages