diff --git a/README.md b/README.md index 435327d..379f96b 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,3 @@ -# yatadabaron +# Yatadabaron -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +Open source search engine in Holy Quran diff --git a/abdlrhmanshehata.yatadabaron.jks b/abdlrhmanshehata.yatadabaron.jks new file mode 100644 index 0000000..8914ff0 Binary files /dev/null and b/abdlrhmanshehata.yatadabaron.jks differ diff --git a/android/app/build.gradle b/android/app/build.gradle index 73f65eb..957d3dc 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -30,7 +30,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { - compileSdkVersion 28 + compileSdkVersion 29 sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -44,7 +44,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "abdlrhmanshehata.yatadabaron" minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 29 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7484d15..51a92dd 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -29,4 +29,5 @@ + \ No newline at end of file diff --git a/kestore.credentials.txt b/kestore.credentials.txt new file mode 100644 index 0000000..00b222a --- /dev/null +++ b/kestore.credentials.txt @@ -0,0 +1,2 @@ +KeystoreAlias key1 +KeystorePassword ilp01bmrIDC! diff --git a/lib/blocs/mushaf-bloc.dart b/lib/blocs/mushaf-bloc.dart index 2bec6d6..bcd4f77 100644 --- a/lib/blocs/mushaf-bloc.dart +++ b/lib/blocs/mushaf-bloc.dart @@ -6,21 +6,29 @@ import '../repositories/chapters-repository.dart'; import '../repositories/verses-repository.dart'; class MushafBloc { - MushafBloc() { - selectChapter(1); + MushafBloc(int chapterId, int verseId) { + selectChapter(chapterId, verseId); } GenericBloc> _versesBloc = GenericBloc(); GenericBloc _selectedChapterBloc = GenericBloc(); - Stream get selectedChapterStream => _selectedChapterBloc.stream; + Stream get selectedChapterStream => + _selectedChapterBloc.stream; Stream> get versesStream => _versesBloc.stream; - Future selectChapter(int id) async{ - List verses = await VersesRepository.instance.getVersesByChapterId(id,false); - ChapterFullDTO chapter = await ChaptersRepository.instance.getFullChapterById(id); + Future selectChapter(int chapterId, int verseId) async { + chapterId = chapterId ?? 1; + ChapterFullDTO chapter = + await ChaptersRepository.instance.getFullChapterById(chapterId); + List verses = + await VersesRepository.instance.getVersesByChapterId(chapterId, false); _selectedChapterBloc.add(chapter); + if (verseId != null && verseId > 0) { + verses.firstWhere((v) => v.verseID == verseId)?.isSelected = true; + } _versesBloc.add(verses); } + Future> get getChaptersSimple async { return await ChaptersRepository.instance.getChaptersSimple(); } diff --git a/lib/dtos/verse-dto.dart b/lib/dtos/verse-dto.dart index 9f3fc4a..6ae501e 100644 --- a/lib/dtos/verse-dto.dart +++ b/lib/dtos/verse-dto.dart @@ -3,6 +3,8 @@ class VerseDTO { final String verseText; final String verseTextTashkel; final int verseID; + final int chapterId; + bool isSelected = false; - VerseDTO(this.chapterName, this.verseText,this.verseTextTashkel, this.verseID); + VerseDTO(this.chapterId,this.chapterName, this.verseText,this.verseTextTashkel, this.verseID); } diff --git a/lib/helpers/event_types.dart b/lib/helpers/event_types.dart new file mode 100644 index 0000000..e6fcf47 --- /dev/null +++ b/lib/helpers/event_types.dart @@ -0,0 +1,5 @@ +class EventTypes{ + static const String SEARCH_PAGE_BASMALA = "SEARCH-PAGE:BASMALA BUTTON"; + static const String STAT_PAGE_BASMALA = "STAT-PAGE:BASMALA BUTTON"; + static const String DRAWER_RATING_BUTTON = "DRAWER:RATING BUTTON"; +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index ef78f88..1debf64 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,12 +1,14 @@ +import 'package:Yatadabaron/services/initialization-service.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'blocs/search-session-bloc.dart'; -import 'repositories/database-provider.dart'; +import 'services/database-provider.dart'; import 'helpers/localization.dart'; import 'helpers/theming.dart'; import 'views/home/home.dart'; import 'views/shared-widgets/loading-widget.dart'; import 'views/splash/splash.dart'; +import 'package:wisebay_essentials/analytics/analytics_helper.dart'; void main() { runApp(App()); @@ -31,7 +33,7 @@ class App extends StatelessWidget { @override Widget build(BuildContext context) { return FutureBuilder( - future: DatabaseProvider.initialize(), + future: InitializationService.instance.initialize(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { if (snapshot.data) { diff --git a/lib/repositories/generic-repository.dart b/lib/repositories/generic-repository.dart index dc8ac60..9c94a03 100644 --- a/lib/repositories/generic-repository.dart +++ b/lib/repositories/generic-repository.dart @@ -1,5 +1,5 @@ import 'package:sqflite/sqflite.dart'; -import '../repositories/database-provider.dart'; +import '../services/database-provider.dart'; class GenericRepository{ Database database; diff --git a/lib/repositories/verses-repository.dart b/lib/repositories/verses-repository.dart index 22a9d72..1975864 100644 --- a/lib/repositories/verses-repository.dart +++ b/lib/repositories/verses-repository.dart @@ -35,7 +35,7 @@ class VersesRepository extends GenericRepository { //Prepare Query String query = - "SELECT ch.arabic as chapter_name,ve.ayah as verse_id,ve.text as verse_text,ve.text_tashkel as verse_text_tashkel " + "SELECT ch.arabic as chapter_name,ve.ayah as verse_id,ve.text as verse_text,ve.text_tashkel as verse_text_tashkel,ch.c0sura as chapter_id " "FROM $table ve " "INNER JOIN chapters ch on ve.sura = ch.c0sura " "WHERE ve.sura $chapterCondition " @@ -53,8 +53,9 @@ class VersesRepository extends GenericRepository { String verseText = verse["verse_text"]; String verseTextTashkel = verse["verse_text_tashkel"]; int verseID = verse["verse_id"]; + int chId = verse["chapter_id"]; VerseDTO result = - VerseDTO(chapterName, verseText, verseTextTashkel, verseID); + VerseDTO(chId,chapterName, verseText, verseTextTashkel, verseID); return result; }).toList(); return results; @@ -82,7 +83,7 @@ class VersesRepository extends GenericRepository { String verseTextTashkel = verse["verse_text_tashkel"]; int verseID = verse["verse_id"]; VerseDTO result = - VerseDTO(chapterName, verseText, verseTextTashkel, verseID); + VerseDTO(id,chapterName, verseText, verseTextTashkel, verseID); return result; }).toList(); return results; diff --git a/lib/repositories/database-provider.dart b/lib/services/database-provider.dart similarity index 100% rename from lib/repositories/database-provider.dart rename to lib/services/database-provider.dart diff --git a/lib/services/initialization-service.dart b/lib/services/initialization-service.dart new file mode 100644 index 0000000..366a987 --- /dev/null +++ b/lib/services/initialization-service.dart @@ -0,0 +1,23 @@ +import 'package:Yatadabaron/services/database-provider.dart'; +import 'package:package_info/package_info.dart'; +import 'package:wisebay_essentials/analytics/analytics_helper.dart'; + +class InitializationService { + static InitializationService instance = InitializationService._(); + InitializationService._(); + Future initialize() async { + try { + await DatabaseProvider.initialize(); + } catch (e) { + return false; + } + try { + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + String version = packageInfo.buildNumber; + await AnalyticsHelper.instance.initialize("YATADABARON", version); + await AnalyticsHelper.instance.logEvent(AnalyticsHelper.APP_STARTED); + await AnalyticsHelper.instance.pushEvents(); + } catch (e) {} + return true; + } +} diff --git a/lib/views/home/search-form.dart b/lib/views/home/search-form.dart index 47b7990..21bea9c 100644 --- a/lib/views/home/search-form.dart +++ b/lib/views/home/search-form.dart @@ -1,5 +1,7 @@ +import 'package:Yatadabaron/helpers/event_types.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:wisebay_essentials/analytics/analytics_helper.dart'; import '../../blocs/search-session-bloc.dart'; import '../../dtos/chapter-simple-dto.dart'; import '../../dtos/search-settings.dart'; @@ -52,7 +54,7 @@ class SearchForm extends StatelessWidget { items: menuItems, value: settings.mode, onChanged: (SearchMode s) { - setState((){ + setState(() { settings.mode = s; }); }, @@ -77,7 +79,8 @@ class SearchForm extends StatelessWidget { Expanded( flex: 1, child: FutureBuilder( - future: ChaptersRepository.instance.getChaptersSimple(includeWholeQuran: true), + future: ChaptersRepository.instance + .getChaptersSimple(includeWholeQuran: true), builder: (BuildContext context, AsyncSnapshot> snapshot) { if (snapshot.hasData) { @@ -128,7 +131,9 @@ class SearchForm extends StatelessWidget { builder: (context, setState) { return Switch( value: settings.basmala, - onChanged: (bool val) { + onChanged: (bool val) async { + AnalyticsHelper.instance.logEvent( + EventTypes.SEARCH_PAGE_BASMALA + "-" + val.toString()); setState(() { settings.basmala = val; }); @@ -183,7 +188,7 @@ class SearchForm extends StatelessWidget { @override Widget build(BuildContext context) { - keywordController.addListener((){ + keywordController.addListener(() { settings.keyword = keywordController.text; }); return SingleChildScrollView( diff --git a/lib/views/home/search-results-list.dart b/lib/views/home/search-results-list.dart index 7d59ab3..4492a91 100644 --- a/lib/views/home/search-results-list.dart +++ b/lib/views/home/search-results-list.dart @@ -1,3 +1,6 @@ +import 'package:Yatadabaron/blocs/mushaf-bloc.dart'; +import 'package:Yatadabaron/helpers/global-colors.dart'; +import 'package:Yatadabaron/views/mushaf/mushaf.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -12,6 +15,17 @@ import '../../views/shared-widgets/loading-widget.dart'; class SearchResultsList extends StatelessWidget { @override Widget build(BuildContext context) { + void navigateToMushaf(int chapterId, int verseId) { + Navigator.of(context).push( + MaterialPageRoute(builder: (_) { + return Provider( + child: MushafPage(), + create: (_) => MushafBloc(chapterId,verseId), + ); + }), + ); + } + SearchSessionBloc sessionBloc = Provider.of(context); return StreamBuilder( stream: sessionBloc.payloadStream, @@ -33,7 +47,9 @@ class SearchResultsList extends StatelessWidget { if (collections.length == 1) { return ListView.separated( itemCount: results.length, - separatorBuilder: (_, __) => Divider(thickness: 1,), + separatorBuilder: (_, __) => Divider( + thickness: 1, + ), itemBuilder: (_, i) { VerseDTO verse = results[i]; return ListTile( @@ -48,7 +64,7 @@ class SearchResultsList extends StatelessWidget { "${verse.chapterName}", style: TextStyle(fontWeight: FontWeight.bold), ), - onTap: (){ + onTap: () { snapshot.data.copyVerse(verse); }, ); @@ -70,21 +86,22 @@ class SearchResultsList extends StatelessWidget { children: [ ListTile( title: Text( - "${verse.verseTextTashkel} {${verse.verseID}}", + "${verse.verseTextTashkel} [${verse.chapterName}-${verse.verseID}]", style: TextStyle( fontWeight: FontWeight.normal, fontSize: 18, ), ), - trailing: Text( - "${verse.chapterName}", - style: TextStyle(fontWeight: FontWeight.bold), - ), - onTap: (){ + onTap: () { + navigateToMushaf(verse.chapterId, verse.verseID); + }, + onLongPress: () { snapshot.data.copyVerse(verse); }, ), - Divider(thickness: 1,) + Divider( + thickness: 1, + ) ], ); }).toList(), diff --git a/lib/views/mushaf/chapters-dropdown.dart b/lib/views/mushaf/chapters-dropdown.dart index fb575c7..77f40e6 100644 --- a/lib/views/mushaf/chapters-dropdown.dart +++ b/lib/views/mushaf/chapters-dropdown.dart @@ -1,17 +1,18 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import '../../blocs/mushaf-bloc.dart'; import '../../dtos/chapter-simple-dto.dart'; import '../../helpers/localization.dart'; import '../../views/shared-widgets/loading-widget.dart'; class ChaptersDropDown extends StatelessWidget { - final MushafBloc mushafBloc; - - const ChaptersDropDown(this.mushafBloc); + final BuildContext parentContext; + const ChaptersDropDown(this.parentContext); @override Widget build(BuildContext context) { + MushafBloc mushafBloc = Provider.of(this.parentContext); return FutureBuilder>( future: mushafBloc.getChaptersSimple, builder: (BuildContext context, @@ -22,6 +23,7 @@ class ChaptersDropDown extends StatelessWidget { List chapters = snapshot.data; return Container( height: 300, + width: double.maxFinite, child: ListView.separated( separatorBuilder: (_,__)=>Divider(), itemCount: chapters.length, @@ -31,7 +33,7 @@ class ChaptersDropDown extends StatelessWidget { title: Text(chapter.chapterNameAR), leading: Text("${chapter.chapterID}"), onTap: () { - mushafBloc.selectChapter(chapter.chapterID); + mushafBloc.selectChapter(chapter.chapterID,null); Navigator.of(context).pop(); }, ); @@ -42,7 +44,7 @@ class ChaptersDropDown extends StatelessWidget { ); } - static show(BuildContext context, MushafBloc bloc) { + static show(BuildContext context) { showDialog( context: context, child: SimpleDialog( @@ -52,7 +54,7 @@ class ChaptersDropDown extends StatelessWidget { ), contentPadding: EdgeInsets.all(5), children: [ - ChaptersDropDown(bloc), + ChaptersDropDown(context), ], ), ); diff --git a/lib/views/mushaf/mushaf.dart b/lib/views/mushaf/mushaf.dart index d7f6d85..598c272 100644 --- a/lib/views/mushaf/mushaf.dart +++ b/lib/views/mushaf/mushaf.dart @@ -52,7 +52,7 @@ class MushafPage extends StatelessWidget { ], ), onTap: () { - ChaptersDropDown.show(context, mushafBloc); + ChaptersDropDown.show(context); }, ), ), diff --git a/lib/views/mushaf/verse-list.dart b/lib/views/mushaf/verse-list.dart index 250ba58..4d33f38 100644 --- a/lib/views/mushaf/verse-list.dart +++ b/lib/views/mushaf/verse-list.dart @@ -1,49 +1,64 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; +import 'package:share/share.dart'; import '../../blocs/mushaf-bloc.dart'; import '../../dtos/verse-dto.dart'; import '../../helpers/localization.dart'; import '../../helpers/utils.dart'; import '../../views/shared-widgets/loading-widget.dart'; -class VerseList extends StatelessWidget{ +class VerseList extends StatelessWidget { @override Widget build(BuildContext context) { - MushafBloc mushafBloc = Provider.of(context); + MushafBloc mushafBloc = Provider.of(context); + ItemScrollController _scrollController = ItemScrollController(); + return StreamBuilder>( stream: mushafBloc.versesStream, - builder: (BuildContext context, - AsyncSnapshot> snapshot) { + builder: (BuildContext context, AsyncSnapshot> snapshot) { if (!snapshot.hasData) { return LoadingWidget(); } List results = snapshot.data; if (results.length == 0) { return Center( - child: Text(Localization.EMPTY_SEARCH_RESULTS,style: Utils.emptyListStyle(),), + child: Text( + Localization.EMPTY_SEARCH_RESULTS, + style: Utils.emptyListStyle(), + ), ); } - return ListView.separated( - separatorBuilder: (BuildContext context, int index) { - return Divider(); - }, + int scrollIndex = 0; + if (results.any((v) => v.isSelected)) { + int selectedVerseId = results.firstWhere((v) => v.isSelected).verseID; + scrollIndex = selectedVerseId - 1; + } + return ScrollablePositionedList.builder( + itemScrollController: _scrollController, itemCount: results.length, - itemBuilder: (BuildContext context, int i) { + initialScrollIndex: scrollIndex, + itemBuilder: (context, i) { VerseDTO result = results[i]; String body = "${result.verseTextTashkel}"; return ListTile( title: Text( body, - style: TextStyle(fontWeight: FontWeight.w200,fontSize: 18), + style: TextStyle(fontWeight: FontWeight.w200, fontSize: 18), ), + selected: result.isSelected, leading: Text("${result.verseID}"), + onTap: () { + String toCopy = + "${result.chapterName}\n${result.verseTextTashkel} {${result.verseID}}"; + Share.share(toCopy); + }, ); }, ); }, ); } - -} \ No newline at end of file +} diff --git a/lib/views/shared-widgets/custom-drawer.dart b/lib/views/shared-widgets/custom-drawer.dart index e7a2f38..74a28da 100644 --- a/lib/views/shared-widgets/custom-drawer.dart +++ b/lib/views/shared-widgets/custom-drawer.dart @@ -43,7 +43,7 @@ class CustomDrawer extends StatelessWidget { Navigator.of(context).pushReplacement(MaterialPageRoute( builder: (context) => Provider( child: MushafPage(), - create: (contextt) => MushafBloc(), + create: (contextt) => MushafBloc(null,null), ), )); }, diff --git a/lib/views/statistics/statistics-form.dart b/lib/views/statistics/statistics-form.dart index 12118d9..056c257 100644 --- a/lib/views/statistics/statistics-form.dart +++ b/lib/views/statistics/statistics-form.dart @@ -1,5 +1,7 @@ +import 'package:Yatadabaron/helpers/event_types.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:wisebay_essentials/analytics/analytics_helper.dart'; import '../../blocs/statistics-bloc.dart'; import '../../dtos/chapter-simple-dto.dart'; import '../../dtos/statistics-settings.dart'; @@ -75,7 +77,8 @@ class StatisticsForm extends StatelessWidget{ builder: (context, setState) { return Switch( value: settings.basmala, - onChanged: (bool val) { + onChanged: (bool val) async { + await AnalyticsHelper.instance.logEvent("${EventTypes.STAT_PAGE_BASMALA}-${val.toString()}"); setState(() { settings.basmala = val; }); @@ -104,7 +107,7 @@ class StatisticsForm extends StatelessWidget{ padding: EdgeInsets.all(5), child: _customButton( context: context, - onPressed: () { + onPressed: (){ try { this.bloc.changeSettings(settings); } catch (e) { diff --git a/pubspec.lock b/pubspec.lock index c37863c..05bcb47 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -78,6 +78,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.3" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "5.2.1" flutter: dependency: "direct main" description: flutter @@ -95,6 +102,25 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + http: + dependency: "direct main" + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.2" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.4" image: dependency: transitive description: @@ -165,6 +191,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.5" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+2" path_provider_macos: dependency: transitive description: @@ -179,6 +212,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.0" petitparser: dependency: transitive description: @@ -200,6 +240,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.13" provider: dependency: "direct main" description: @@ -221,6 +268,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.23.1" + scrollable_positioned_list: + dependency: "direct main" + description: + name: scrollable_positioned_list + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.8" share: dependency: "direct main" description: @@ -228,6 +282,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.4+3" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.10" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.2+4" + shared_preferences_macos: + dependency: transitive + description: + name: shared_preferences_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+11" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2+7" sky_engine: dependency: transitive description: flutter @@ -310,6 +399,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.8" + wisebay_essentials: + dependency: "direct main" + description: + path: "c:/wisebay_essentials/" + relative: false + source: path + version: "0.0.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0" xml: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9368372..d9e0ab1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: Quran Search Engine and Statistics. # 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: 6.2.0+16 +version: 6.4.0+19 environment: sdk: ">=2.6.0 <3.0.0" @@ -19,6 +19,8 @@ environment: dependencies: flutter: sdk: flutter + wisebay_essentials: + path: c:/wisebay_essentials/ sqflite: any rxdart: ^0.23.0 provider: ^4.0.5 @@ -27,10 +29,12 @@ dependencies: share: ^0.6.4+3 launch_review: ^2.0.0 package_info: ^0.4.1 - + scrollable_positioned_list: ^0.1.8 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 + shared_preferences: ^0.5.7+3 + http: ^0.12.2 flutter_icons: image_path: 'icon/icon.png'