From e686c6f7a16ce49ab7b7f0f30a6921a207003131 Mon Sep 17 00:00:00 2001 From: sindhu Date: Tue, 9 Jan 2024 09:30:42 +0700 Subject: [PATCH] 3. import asset, proses login google mail --- android/app/build.gradle | 4 +- android/app/google-services.json | 47 +++++ android/app/src/main/AndroidManifest.xml | 3 + android/build.gradle | 1 + images/background_splash.png | Bin 0 -> 34930 bytes images/emoji_handshake.png | Bin 0 -> 1075 bytes images/icon_google.png | Bin 0 -> 661 bytes images/logo_sismedika_landscape.png | Bin 0 -> 10349 bytes images/logo_sismedika_rectangle.png | Bin 0 -> 19060 bytes images/splash_image_bottom.png | Bin 0 -> 3274 bytes images/splash_image_top.png | Bin 0 -> 3301 bytes lib/app/constant.dart | 50 ++++++ lib/app/route.dart | 54 ++++++ lib/main.dart | 120 ++----------- lib/screen/login/login_screen.dart | 213 +++++++++++++++++++++++ lib/screen/splash/splash_screen.dart | 44 +++++ lib/test_flutter_map.dart | 65 +++++++ lib/test_map.dart | 160 +++++++++++++++++ pubspec.yaml | 4 +- 19 files changed, 655 insertions(+), 110 deletions(-) create mode 100644 android/app/google-services.json create mode 100644 images/background_splash.png create mode 100644 images/emoji_handshake.png create mode 100644 images/icon_google.png create mode 100644 images/logo_sismedika_landscape.png create mode 100644 images/logo_sismedika_rectangle.png create mode 100644 images/splash_image_bottom.png create mode 100644 images/splash_image_top.png create mode 100644 lib/app/constant.dart create mode 100644 lib/app/route.dart create mode 100644 lib/screen/login/login_screen.dart create mode 100644 lib/screen/splash/splash_screen.dart create mode 100644 lib/test_flutter_map.dart create mode 100644 lib/test_map.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 22c7ca9..c95be58 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -27,7 +27,8 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { namespace "com.example.absensi_sas_flutter" - compileSdkVersion flutter.compileSdkVersion + // compileSdkVersion flutter.compileSdkVersion + compileSdkVersion 33 ndkVersion flutter.ndkVersion compileOptions { @@ -69,4 +70,5 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation platform('com.google.firebase:firebase-bom:32.7.0') } diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..42861c9 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,47 @@ +{ + "project_info": { + "project_number": "144623481644", + "project_id": "absensisasflutter1", + "storage_bucket": "absensisasflutter1.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:144623481644:android:a3095914ebb628c3137289", + "android_client_info": { + "package_name": "com.example.absensi_sas_flutter" + } + }, + "oauth_client": [ + { + "client_id": "144623481644-idkdin499id9pgtf641qigp565tls3ck.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.example.absensi_sas_flutter", + "certificate_hash": "eb90aa1109a494da4a21790a7feafae5b7c89046" + } + }, + { + "client_id": "144623481644-pg07qfg4n7rnfdmq03gtlilcb0dq2kar.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAJKBcqLWpET5bwanTaUbPWEXlu0KwewH4" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "144623481644-pg07qfg4n7rnfdmq03gtlilcb0dq2kar.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6726e19..8925ec9 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,4 +1,7 @@ + + + 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 Sl?Qm}BhC&7_Eqi;`tiS}4R)OX literal 0 HcmV?d00001 diff --git a/images/emoji_handshake.png b/images/emoji_handshake.png new file mode 100644 index 0000000000000000000000000000000000000000..a07c95da4f1f96de380841689b717cbcaf41ffe4 GIT binary patch literal 1075 zcmV-31kC%1P)P000;W1^@s654Bdt00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yPTAxyf{2PB}=S#7d4my(j-e$0QFdg1iH0R)2`C%v{ig5bLQVkc*cq z<@uGDijnlyzj^=lb&Pd**ror{Wururhk^n80kBHMK;Vyp-*oEvm89 z;u#qyFxE+m;#Y1(dt}T;UYl@HJN~Xv6JSrF>2+Ud-}c?q!>O30nh>bY-#9R(^}^TH zXy)1>2FJNbhlYB1IAFkzwlmxbp?Aozvg?!*m2u#FWK$gEFt;;{COzAOmL9X z`}oZWpu3FWKcASI;WaTS^<)qa>(bS+_3>;<=Z-Pmfr3FA{lja>nzk}(O3HC>A`teK zs^Z32pa1j~E)G_rUB+^E;uHxW!4m*RLJ4pQL;>A)9@1n>O%N^mLT`fqX-~$qB?`mW z<5$&IRNo1Ldfz?03!}15)RiGyilXVggu@rBbO)7tN4XG1V-M<5x)tLaRa?R$qF zGh-~N$_;zcOxk3;WSY+qhm3q2fsoU-pdj_#v(~74qMCc~d^c}(Ov<+QEZSt7St#t! z0%^oAHm&a(DrM8@rTWpmLKPxtP}!|vF6iX%zj$=@r$4T|8Gh8l|Cfd;g}6cTCx3sx z3dWk`5d~ap3(r509|SB2ih_X;hNtV@Zz}SBum8v4P7*)_qJUJb_)Wp+D}yMM9|O~i t<;_W4m&40xlpsPSN1HCMoiL7<;I0HA<@^LT;sFvQ6iS-{3DOWtbRflk0CZOY6?Q;~ zRN&B2d8HtXQd!7B2xBj^Cdd7F&&Ea+$tR6wZ)WG4x!t)r;HZO*b4m*)exg9TEP7ld z;fGO8NC?s%dxhFe3FIX>q_#**jE728PD-RrATQ$~Rk()faErahX546K$V)Sj3-sXW z9FYWcEJY$O$M$r{c9+Da3Yil0u|)P-h}>p7q&0{fkz6-gcst;+$`XUA2{^tJNrFF; zK-SYm7{(Uf^?{cp9SI`Ojtl-91V@xIR)%^x1>8&n3r6){$rXY(*gnyM-{%U0!4k83 z&3Hg&{e#40i1x<$tXhOGnMX2f$fp4J7Y6<_!U;s!A?tG%W{2<>bAL>~=L=WMogb(0 zxO>h5UNqv7bhaa3f9CdX6$UE=)yZ9d8N5Ls+e$t8b{6-#%h<=sRmXKWCgAj)_dG(b z_!-=wZr@mkdH>)->rF3XhMa<$*7owANFrx4RY#;jBy~_OJCZ=*y6dP3>c)wvFRLV# zXL+xAxX&VWg=FpXC);fA*`d9%_+=wk(6@_v@KTqwr{C3Mc+>uDMQ;oFx|f05#~)Ij>&w7hp vndZty_aUhLnhVB3=4P5a4bI8u}25wMLsJQ=Q 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 AS^xk5 literal 0 HcmV?d00001 diff --git a/images/logo_sismedika_rectangle.png b/images/logo_sismedika_rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..f30b924472a48420a267f1e6c39b4af1c91f0170 GIT binary patch literal 19060 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 literal 0 HcmV?d00001 diff --git a/images/splash_image_bottom.png b/images/splash_image_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..b790b9de0c8bacdd0b919fd32705c218f2727d8e GIT binary patch literal 3274 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 IM6N<$f-V_QWdHyG literal 0 HcmV?d00001 diff --git a/images/splash_image_top.png b/images/splash_image_top.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1d7d52a5ce8319fbd63a3bbe840f8b92e74685 GIT binary patch literal 3301 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 literal 0 HcmV?d00001 diff --git a/lib/app/constant.dart b/lib/app/constant.dart new file mode 100644 index 0000000..a5f128e --- /dev/null +++ b/lib/app/constant.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; + +class Constant { + // static double designHeight = 1024; + // static double designWidth = 1440; + + static double designHeightPhone = 844; + static double designWidthPhone = 390; + + // color theme + static Color textBlack = const Color(0xff212B36); + static Color textLightGrey = const Color(0xff919EAB); + + // size convertion + static double getActualXPhone({ + required BuildContext context, + required double x, + }) { + return x / designWidthPhone * MediaQuery.of(context).size.width; + } + + static double getActualYPhone({ + required BuildContext context, + required double y, + }) { + return y / designHeightPhone * MediaQuery.of(context).size.height; + } + + // typography + static TextStyle titleH1_700({required BuildContext context}) { + return TextStyle( + fontSize: Constant.getActualYPhone(context: context, y: 24), + fontWeight: FontWeight.w700, + ); + } + + static TextStyle titleH2_600({required BuildContext context}) { + return TextStyle( + fontSize: Constant.getActualYPhone(context: context, y: 12), + fontWeight: FontWeight.w600, + ); + } + + static TextStyle logintitle_700({required BuildContext context}) { + return TextStyle( + fontSize: Constant.getActualYPhone(context: context, y: 15), + fontWeight: FontWeight.w700, + ); + } +} diff --git a/lib/app/route.dart b/lib/app/route.dart new file mode 100644 index 0000000..29c5784 --- /dev/null +++ b/lib/app/route.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import '../test_flutter_map.dart'; +import '../screen/login/login_screen.dart'; +import '../screen/splash/splash_screen.dart'; + +const loginRoute = "/loginRoute"; +const splashRoute = "/splashRoute"; +const testFlutterMapRoute = "/testFlutterMapRoute"; + +class AppRoute { + static Route generateRoute(RouteSettings settings) { + + // test flutter map + if (settings.name == testFlutterMapRoute) { + return MaterialPageRoute(builder: (context) { + return MediaQuery( + data: MediaQuery.of(context) + .copyWith(textScaleFactor: 1.0, padding: EdgeInsets.all(0)), + child: TestFlutterMap(), + ); + }); + } + + // splash screen + if (settings.name == splashRoute) { + return MaterialPageRoute(builder: (context) { + return MediaQuery( + data: MediaQuery.of(context) + .copyWith(textScaleFactor: 1.0, padding: EdgeInsets.all(0)), + child: SplashScreen(), + ); + }); + } + + // login + if (settings.name == loginRoute) { + return MaterialPageRoute(builder: (context) { + return MediaQuery( + data: MediaQuery.of(context) + .copyWith(textScaleFactor: 1.0, padding: EdgeInsets.all(0)), + child: LoginScreen(), + ); + }); + } + + return MaterialPageRoute(builder: (context) { + return MediaQuery( + data: MediaQuery.of(context) + .copyWith(textScaleFactor: 1.0, padding: const EdgeInsets.all(0)), + child: LoginScreen(), + ); + }); + } +} diff --git a/lib/main.dart b/lib/main.dart index dda5554..0de820a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import '../app/route.dart'; +import '../test_map.dart'; void main() { runApp(const MyApp()); @@ -11,115 +13,19 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'Flutter Demo', + debugShowCheckedModeBanner: false, + title: 'Absensi SAS', + // theme: ThemeData( + // colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + // useMaterial3: true, + // ), theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a blue toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - useMaterial3: true, + primarySwatch: Colors.orange, ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. + // home: TestMap(), + initialRoute: loginRoute, + // initialRoute: testFlutterMapRoute, + onGenerateRoute: AppRoute.generateRoute, ); } } diff --git a/lib/screen/login/login_screen.dart b/lib/screen/login/login_screen.dart new file mode 100644 index 0000000..3d268c9 --- /dev/null +++ b/lib/screen/login/login_screen.dart @@ -0,0 +1,213 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:google_sign_in/google_sign_in.dart'; + +import '../../app/constant.dart'; + +class LoginScreen extends StatefulWidget { + const LoginScreen({super.key}); + + @override + State createState() => _LoginScreenState(); +} + +class _LoginScreenState extends State { + GoogleSignInAccount? _currentUser; + final GoogleSignIn _googleSignIn = GoogleSignIn( + scopes: [ + 'email', + 'https://www.googleapis.com/auth/contacts.readonly', + ], + ); + + @override + void initState() { + _googleSignIn.onCurrentUserChanged.listen((account) { + setState(() { + _currentUser = account; + }); + }); + _googleSignIn.signInSilently(); + super.initState(); + } + + Future _handleSignIn() async { + try { + await _googleSignIn.signIn(); + } catch (error) { + if (kDebugMode) { + print(error); + } + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: SingleChildScrollView( + child: Column( + children: [ + SizedBox( + height: Constant.getActualYPhone(context: context, y: 100), + ), + _currentUser != null + ? Container( + child: ListTile( + leading: GoogleUserCircleAvatar( + identity: _currentUser!, + ), + title: Text( + _currentUser!.displayName ?? "", + ), + subtitle: Text( + _currentUser!.email, + ), + trailing: IconButton( + icon: Icon(Icons.logout_outlined), + onPressed: () async { + await _googleSignIn.disconnect(); + }, + ), + ), + ) + : + // Logo Landscape + Padding( + padding: EdgeInsets.only( + top: Constant.getActualYPhone(context: context, y: 120), + left: Constant.getActualXPhone(context: context, x: 91), + right: + Constant.getActualXPhone(context: context, x: 90), + // bottom: Constant.getActualYPhone(context: context, y: y) + ), + child: Container( + width: + Constant.getActualXPhone(context: context, x: 209), + height: + Constant.getActualYPhone(context: context, y: 70), + decoration: BoxDecoration( + // color: Colors.green, + image: DecorationImage( + // fit: BoxFit.contain, + image: AssetImage( + 'images/logo_sismedika_landscape.png'), + ), + ), + ), + ), + + SizedBox( + height: Constant.getActualYPhone(context: context, y: 100), + ), + + // title + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Selamat Datang', + style: Constant.titleH1_700(context: context) + .copyWith(color: Constant.textBlack), + ), + Container( + width: Constant.getActualXPhone(context: context, x: 24), + height: Constant.getActualYPhone(context: context, y: 24), + // color: Colors.redAccent, + decoration: BoxDecoration( + // color: Colors.green, + image: DecorationImage( + // fit: BoxFit.contain, + image: AssetImage('images/emoji_handshake.png'), + ), + ), + ), + ], + ), + + SizedBox( + height: Constant.getActualYPhone(context: context, y: 7), + ), + + // title grey + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Silahkan masuk untuk mengakses akun Anda', + style: Constant.titleH2_600(context: context).copyWith( + color: Constant.textLightGrey, + ), + ), + ], + ), + + SizedBox( + height: Constant.getActualYPhone(context: context, y: 64), + ), + + // button login + Padding( + padding: EdgeInsets.only( + left: Constant.getActualXPhone(context: context, x: 23), + right: Constant.getActualXPhone(context: context, x: 23), + ), + child: SizedBox( + width: Constant.getActualXPhone(context: context, x: 344), + height: Constant.getActualYPhone(context: context, y: 48), + child: ElevatedButton( + onPressed: () async { + await _handleSignIn(); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: + Constant.getActualXPhone(context: context, x: 24), + height: + Constant.getActualYPhone(context: context, y: 24), + decoration: BoxDecoration( + // color: Colors.green, + image: DecorationImage( + // fit: BoxFit.contain, + image: AssetImage('images/icon_google.png'), + ), + ), + ), + SizedBox( + width: + Constant.getActualXPhone(context: context, x: 2), + ), + Text( + 'Continue with Google', + style: Constant.logintitle_700(context: context) + .copyWith( + color: Constant.textBlack, + ), + ), + ], + ), + style: ButtonStyle( + backgroundColor: MaterialStateColor.resolveWith( + (st) => Colors.white, + ), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(24), + side: BorderSide( + color: Color.fromRGBO(145, 158, 171, 0.32), + ), + ), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/screen/splash/splash_screen.dart b/lib/screen/splash/splash_screen.dart new file mode 100644 index 0000000..5c79600 --- /dev/null +++ b/lib/screen/splash/splash_screen.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import '../../app/constant.dart'; + +class SplashScreen extends StatelessWidget { + const SplashScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: ListView( + children: [ + Container( + // width: Constant.getActualXPhone(context: context, x: 390), + height: Constant.getActualYPhone(context: context, y: 844), + decoration: BoxDecoration( + color: Colors.blue, // Ganti dengan warna dan gambar yang sesuai + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage( + 'images/background_splash.png'), // Ganti dengan path gambar yang diinginkan + ), + ), + child: Align( + alignment: Alignment.center, + child: Container( + width: Constant.getActualXPhone(context: context, x: 200), + height: Constant.getActualYPhone(context: context, y: 200), + decoration: BoxDecoration( + // color: Colors.green, + image: DecorationImage( + // fit: BoxFit.contain, + image: AssetImage('images/logo_sismedika_rectangle.png'), + ), + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/test_flutter_map.dart b/lib/test_flutter_map.dart new file mode 100644 index 0000000..ea5b2ae --- /dev/null +++ b/lib/test_flutter_map.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong2/latlong.dart'; + +class TestFlutterMap extends StatefulWidget { + const TestFlutterMap({super.key}); + + @override + State createState() => _TestFlutterMapState(); +} + +class _TestFlutterMapState extends State { + late final MapController _mapController; + double _rotation = 0; + + static const _london = LatLng(51.5, -0.09); + static const _paris = LatLng(48.8566, 2.3522); + static const _dublin = LatLng(53.3498, -6.2603); + + static const _kantor = LatLng(-7.538761, 110.795699); + + static const _markers = [ + Marker( + width: 10, + height: 10, + point: _kantor, + child: FlutterLogo( + key: ValueKey('green'), + ), + ), + ]; + + @override + void initState() { + super.initState(); + _mapController = MapController(); + } + + @override + Widget build(BuildContext context) { + return FlutterMap( + mapController: _mapController, + options: MapOptions( + initialCenter: LatLng(-7.538761, 110.795699), + initialZoom: 5, + maxZoom: 20, + minZoom: 3, + ), + children: [ + // openStreetMapTileLayer, + TileLayer( + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'dev.fleaflet.flutter_map.example', + subdomains: ['a', 'b', 'c'] + // Use the recommended flutter_map_cancellable_tile_provider package to + // support the cancellation of loading tiles. + // tileProvider: , + ), + const MarkerLayer( + markers: _markers, + ), + ], + ); + } +} diff --git a/lib/test_map.dart b/lib/test_map.dart new file mode 100644 index 0000000..fbca97c --- /dev/null +++ b/lib/test_map.dart @@ -0,0 +1,160 @@ +import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:geocoding/geocoding.dart'; + +class TestMap extends StatefulWidget { + const TestMap({super.key}); + + @override + State createState() => _TestMapState(); +} + +class _TestMapState extends State { + /// Determine the current position of the device. + /// + /// When the location services are not enabled or permissions + /// are denied the `Future` will return an error. + Future> determinePosition() async { + bool serviceEnabled; + LocationPermission permission; + + // Test if location services are enabled. + serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + // Location services are not enabled don't continue + // accessing the position and request users of the + // App to enable the location services. + return Future.error('Location services are disabled.'); + } + + permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + // Permissions are denied, next time you could try + // requesting permissions again (this is also where + // Android's shouldShowRequestPermissionRationale + // returned true. According to Android guidelines + // your App should show an explanatory UI now. + // return Future.error('Location permissions are denied'); + + return { + "message": "Ijinkan Lokasi di HP", + "error": true, + }; + } + } + + if (permission == LocationPermission.deniedForever) { + // Permissions are denied forever, handle appropriately. + // return Future.error( + // 'Location permissions are permanently denied, we cannot request permissions.'); + return { + "message": "Ijinkan Lokasi di HP", + "error": true, + }; + } + + // When we reach here, permissions are granted and we can + // continue accessing the position of the device. + Position position = await Geolocator.getCurrentPosition(); + + return { + "position": position, + "message": "Berhasil mendapatkan posisi", + "error": false + }; + } + + String latitude = ""; + String longitude = ""; + String addressFromCoordinat = ""; + String jarak = ""; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Test Map'), + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (latitude.isNotEmpty && longitude.isNotEmpty) + ? Text('Coordinat Akhir: $latitude , $longitude') + : SizedBox.shrink(), + (addressFromCoordinat.isNotEmpty) + ? Text('Address : $addressFromCoordinat') + : SizedBox.shrink(), + (jarak.isNotEmpty) ? Text('Jarak : $jarak') : SizedBox.shrink(), + SizedBox( + height: 10, + ), + Text('SFA Klodran : -7.5350973, 110.7921524'), + SizedBox( + height: 10, + ), + ElevatedButton( + child: Text('Determine Position'), + onPressed: () async { + print('ABSENSI'); + Map posx = await determinePosition(); + print('${posx}'); + + if (posx['error'] == false) { + Position position = posx['position']; + List placemarks = await placemarkFromCoordinates( + position.latitude, position.longitude); + print('placemark : ${placemarks}'); + + double jarakx = await Geolocator.distanceBetween(-7.5350973, + 110.7921524, position.latitude, position.longitude); + + setState(() { + jarak = jarakx.toString() + " meter"; + longitude = position.longitude.toString(); + latitude = position.latitude.toString(); + addressFromCoordinat = placemarks[0].street.toString() + + " , " + + placemarks[0].subLocality.toString() + + " , " + + placemarks[0].locality.toString() + + " , " + + placemarks[0].postalCode.toString() + + " , " + + placemarks[0].country.toString(); + }); + } else { + setState(() { + longitude = ""; + addressFromCoordinat = ""; + jarak = ""; + latitude = posx['message'].toString(); + }); + } + }, + ), + SizedBox( + height: 20, + ), + ElevatedButton( + onPressed: () { + setState(() { + latitude = ""; + longitude = ""; + addressFromCoordinat = ""; + jarak = ""; + }); + }, + child: Text('Clear'), + ), + ], + ), + ), + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index fa5696f..59f3ded 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -70,8 +70,8 @@ flutter: uses-material-design: true # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg + assets: + - images/ # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see