diff --git a/lib/main.dart b/lib/main.dart index 26c981eef358d135d1e378d9d219b793aff419d1..385c75275ba37d720b448c0d84f723c941d41cff 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:mobile_apps/src/app.dart'; +import 'package:mobile_apps/src/routes.dart'; void main() { + AppRoute.setupRouter(); runApp(App()); } diff --git a/lib/src/app.dart b/lib/src/app.dart index 9a351e466364c6bbde926a2dbf17e726b571f1cd..90f5bbbc964804222929c2284dcbc320569896b3 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -18,8 +18,8 @@ class App extends StatelessWidget { theme: AppTheme.light(), themeMode: ThemeMode.light, darkTheme: AppTheme.dark(), - initialRoute: AppRoutes.home.route, - routes: AppRoutes.routes, + onGenerateRoute: AppRoute.router.generator, + initialRoute: AppRoute.home, ), ); } diff --git a/lib/src/routes.dart b/lib/src/routes.dart index afae757b13324bc6d9834e793ca3f625538c9f81..0b7b84c2c722c0009d1734985a706fc0eed6712c 100644 --- a/lib/src/routes.dart +++ b/lib/src/routes.dart @@ -1,44 +1,62 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:mobile_apps/src/screens/detail-item-needs/detail-item.dart'; import 'package:mobile_apps/src/screens/home/inventories/all_inventories.dart'; - +import 'package:mobile_apps/src/screens/institusi-screen/institusi_screen.dart'; +import 'package:fluro/fluro.dart'; import 'screens/home/home_screen.dart'; import 'screens/login/login_screen.dart'; class AppRoute { - final String route; - final WidgetBuilder widgetBuilder; - - AppRoute(this.route, this.widgetBuilder) - : assert(route.startsWith('/')), - assert(widgetBuilder != null); -} - -class AppRoutes { - // Add known registered routes in this variable - static final List<AppRoute> _registeredRoutes = [ - AppRoutes.home, - AppRoutes.login, - AppRoutes.recap - ]; - - static Map<String, WidgetBuilder> get routes => Map.fromEntries( - _registeredRoutes.map( - (route) => - MapEntry<String, WidgetBuilder>(route.route, route.widgetBuilder), - ), - ); - - // Route for Home Screen - static final AppRoute home = AppRoute('/home', (_) => HomeScreen()); - - // Route for Login Screen - static final AppRoute login = AppRoute('/login', (_) => LoginScreen()); - - // Route for rekap siaga wabah - static final AppRoute recap = - AppRoute('/recap', (_) => AllInventoriesWidget()); - /** - * Add new Route definition below here and add it to [AppRoutes._registeredRoutes] - */ + static String home = '/home'; + static String login = '/login'; + static String recap = '/recap'; + static String institusi( + {@required String idInstitusi, @required String namaInstitusi}) => + '/institusi/$idInstitusi/$namaInstitusi'; + static String itemNeeded( + {@required String idInstitusi, + @required String idItemNeeded, + @required String namaInstitusi}) => + '/itemNeeded/$idItemNeeded/$idInstitusi/$namaInstitusi'; + + static Router router = Router(); + + static final Handler _homeHandler = Handler( + handlerFunc: (BuildContext context, Map<String, dynamic> params) => + HomeScreen()); + static final Handler _loginHandler = Handler( + handlerFunc: (BuildContext context, Map<String, dynamic> params) => + LoginScreen()); + static final Handler _recapHandler = Handler( + handlerFunc: (BuildContext context, Map<String, dynamic> params) => + AllInventoriesWidget()); + static final Handler _institusiHandler = Handler( + handlerFunc: (BuildContext context, Map<String, dynamic> params) => + InstitusiScreen( + namaInstitusi: params['namaInstitusi'][0], + idInstitusi: params['idInstitusi'][0])); + static final Handler _itemNeededHandler = Handler( + handlerFunc: (BuildContext context, Map<String, dynamic> params) => + DetailItemNeeds( + idInstitusi: params['idInstitusi'][0], + idItemNeeded: params['idItemNeeded'][0], + institusiName: params['namaInstitusi'][0])); + + static void setupRouter() { + router.define( + '/home', + handler: _homeHandler, + ); + router.define( + '/login', + handler: _loginHandler, + ); + router.define('/recap', handler: _recapHandler); + router.define('/institusi/:idInstitusi/:namaInstitusi', + handler: _institusiHandler); + router.define( + '/itemNeeded/:idItemNeeded/:idInstitusi/:namaInstitusi', + handler: _itemNeededHandler); + } } diff --git a/lib/src/screens/home/institusi/institusi.dart b/lib/src/screens/home/institusi/institusi.dart index 4febc87db791e85d3d4ceede41abe0fc625e7996..7e4622a2601fab5d277f072eddc2c1e163aa1a44 100644 --- a/lib/src/screens/home/institusi/institusi.dart +++ b/lib/src/screens/home/institusi/institusi.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:mobile_apps/src/components/progressbar/progressbar.dart'; import 'package:mobile_apps/src/models/institusi.dart'; -import 'package:mobile_apps/src/screens/institusi-screen/institusi_screen.dart'; +import 'package:mobile_apps/src/routes.dart'; class InstitusiWidget extends StatelessWidget { final Institusi institusi; @@ -36,13 +36,9 @@ class InstitusiWidget extends StatelessWidget { borderRadius: BorderRadius.circular(32)), splashColor: Colors.redAccent, onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => InstitusiScreen( - namaInstitusi: institusi.nama, - idInstitusi: institusi.id, - ))); + Navigator.of(context).pushNamed(AppRoute.institusi( + namaInstitusi: institusi.nama, + idInstitusi: institusi.id)); }, child: Text( 'Detail Kebutuhan', diff --git a/lib/src/screens/home/inventories/inventories.dart b/lib/src/screens/home/inventories/inventories.dart index 1e72292fb9d6d76d0b14eca2b25a953219f98718..dee5b4716c221227b11b8fbe98831bcc161dc301 100644 --- a/lib/src/screens/home/inventories/inventories.dart +++ b/lib/src/screens/home/inventories/inventories.dart @@ -51,7 +51,7 @@ class InventoriesWidget extends StatelessWidget { decoration: TextDecoration.underline), ), onPressed: () { - Navigator.of(context).pushNamed(AppRoutes.recap.route); + Navigator.of(context).pushNamed(AppRoute.recap); }, ), ), diff --git a/lib/src/screens/institusi-screen/institusi_screen.dart b/lib/src/screens/institusi-screen/institusi_screen.dart index efd34274541ebaf2fa98b976dbb7c8e5087c1a24..c5ace73e17d1043822595e7f9ccafd816f011690 100644 --- a/lib/src/screens/institusi-screen/institusi_screen.dart +++ b/lib/src/screens/institusi-screen/institusi_screen.dart @@ -2,7 +2,8 @@ import 'package:flutter/material.dart'; import 'package:mobile_apps/src/common/constants.dart'; import 'package:mobile_apps/src/screens/home/kontak/kontak.dart'; import 'package:esys_flutter_share/esys_flutter_share.dart'; -import 'package:path/path.dart' as p; +import 'dart:io'; +import 'package:screenshot/screenshot.dart'; import 'kebutuhan/kebutuhan.dart'; class InstitusiScreen extends StatefulWidget { @@ -50,13 +51,15 @@ class _InstitusiScreenState extends State<InstitusiScreen> IconButton( icon: Icon(Icons.share), onPressed: () { - var frag = p.join('/', 'institusi'); - var url = Uri( - scheme: 'https', host: 'sigap.cs.ui.ac.id', fragment: frag); - Share.text( - 'Ayo bantu tenaga medis di Siaga Wabah', - 'Ayo bantu tenaga medis melawan COVID-19 di $url', - 'text/plain'); + ScreenshotController() + .capture(pixelRatio: 1.5) + .then((File image) { + Share.file( + 'Siaga Wabah', + 'Siaga_Wabah_${widget.namaInstitusi}.png', + image.readAsBytesSync(), + 'image/png'); + }); }, // margin: EdgeInsets.only(right: 8.0), ), diff --git a/lib/src/screens/institusi-screen/kebutuhan/kebutuhan.dart b/lib/src/screens/institusi-screen/kebutuhan/kebutuhan.dart index 4e60e693c5a7ad617a0dee365e2efc398bbf19a8..0ee858f9f8e3a5b95efb237749a1fc48606cb7f9 100644 --- a/lib/src/screens/institusi-screen/kebutuhan/kebutuhan.dart +++ b/lib/src/screens/institusi-screen/kebutuhan/kebutuhan.dart @@ -3,7 +3,7 @@ import 'package:flutter/scheduler.dart'; import 'package:mobile_apps/src/common/constants.dart'; import 'package:mobile_apps/src/repositories/item_repositories.dart'; import 'package:mobile_apps/src/repositories/kebutuhan_repository.dart'; -import 'package:mobile_apps/src/screens/detail-item-needs/detail-item.dart'; +import 'package:mobile_apps/src/routes.dart'; class Kebutuhan extends StatelessWidget { final String idInstitusi; @@ -62,21 +62,19 @@ class Kebutuhan extends StatelessWidget { } Widget kebutuhanProgress( - {@required String idItemNeeded, @required String idItem, + {@required String idItemNeeded, + @required String idItem, @required int kebutuhan, @required int terpenuhi, @required BuildContext context}) { final itemRepository = ItemRepository(path: idItem); return InkWell( onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => DetailItemNeeds( - idInstitusi: idInstitusi, - idItemNeeded: idItemNeeded, - institusiName: namaInstitusi, - ))); + Navigator.of(context).pushNamed(AppRoute.itemNeeded( + idInstitusi: idInstitusi, + idItemNeeded: idItemNeeded, + namaInstitusi: namaInstitusi, + )); }, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, diff --git a/lib/src/screens/login/login_screen.dart b/lib/src/screens/login/login_screen.dart index a647a594145ff6ed0debc095bc24e825e005c261..9e3d1b778d012f9d094cd3e018ef753b558982f1 100644 --- a/lib/src/screens/login/login_screen.dart +++ b/lib/src/screens/login/login_screen.dart @@ -33,7 +33,7 @@ class _LoginScreenState extends State<LoginScreen> { setState(() => isLoading = false); } if (authService.isAuthenticated) { - await Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.home.route, (_) => false); + await Navigator.of(context).pushNamedAndRemoveUntil(AppRoute.home, (_) => false); } } diff --git a/lib/src/widgets/auth_guard_widget.dart b/lib/src/widgets/auth_guard_widget.dart index 45d4d6892914bf61392a3aa38a6789c344f38b41..a331e12b75f7378be082b137565c540579c31c00 100644 --- a/lib/src/widgets/auth_guard_widget.dart +++ b/lib/src/widgets/auth_guard_widget.dart @@ -11,7 +11,7 @@ class AuthGuardWidget extends StatelessWidget { final authService = Provider.of<AuthService>(context); if (!authService.isAuthenticated) { SchedulerBinding.instance.addPostFrameCallback((_) { - Navigator.of(context).pushReplacementNamed(AppRoutes.login.route); + Navigator.of(context).pushReplacementNamed(AppRoute.login); }); return Container(); } diff --git a/pubspec.lock b/pubspec.lock index c1921ceca60797305f7f625ac8d3e5ccc350f784..b57be1927139195b4d9807ef81779f5ab12dc701 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -281,6 +281,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.10.11" + fluro: + dependency: "direct main" + description: + name: fluro + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.1" flutter: dependency: "direct main" description: flutter @@ -751,4 +758,4 @@ packages: version: "2.2.0" sdks: dart: ">=2.7.0 <3.0.0" - flutter: ">=1.12.13+hotfix.4 <2.0.0" + flutter: ">=1.12.13+hotfix.4 <1.16.0" diff --git a/pubspec.yaml b/pubspec.yaml index 93356c6b6403825aaae40ca5211111ec080e6257..6b9c03441e1ec26acb17ca9cc508d2f1ab9c6b07 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,6 +24,7 @@ dependencies: firebase_auth: ^0.15.5+3 cloud_firestore: ^0.13.3 google_sign_in: ^4.2.0 + fluro: ^1.6.1 # Other Flutter dependencies