From 757b72a9f0bc9de76351fb96a7a29fb2ecd4ab59 Mon Sep 17 00:00:00 2001 From: sindhu Date: Fri, 26 Jan 2024 08:01:33 +0700 Subject: [PATCH] step 9 : add fungsi permission handler, get current latitude, longitude --- images/clockin_presensi.png | Bin 0 -> 485 bytes images/clockout_presensi.png | Bin 0 -> 488 bytes images/finger_presensi.png | Bin 0 -> 702 bytes images/presensi_finger1.png | Bin 0 -> 47314 bytes images/presensi_finger2.png | Bin 0 -> 3790 bytes images/sync_white.png | Bin 0 -> 356 bytes lib/app/constant.dart | 17 + lib/app/route.dart | 13 + lib/main.dart | 2 +- lib/screen/login/login_screen.dart | 42 +- lib/screen/presensi/presensi_screen.dart | 438 ++++++++++++++++++ pubspec.lock | 40 ++ pubspec.yaml | 1 + .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 15 files changed, 535 insertions(+), 22 deletions(-) create mode 100644 images/clockin_presensi.png create mode 100644 images/clockout_presensi.png create mode 100644 images/finger_presensi.png create mode 100644 images/presensi_finger1.png create mode 100644 images/presensi_finger2.png create mode 100644 images/sync_white.png create mode 100644 lib/screen/presensi/presensi_screen.dart diff --git a/images/clockin_presensi.png b/images/clockin_presensi.png new file mode 100644 index 0000000000000000000000000000000000000000..7b212648b22ee7b5978ce8f8b03f9d1b0f371ee3 GIT binary patch literal 485 zcmV z*lU&|Qod%rs~!E`oyQKqo?QpQBGem>Ac-lPB&_x7G5j|{>h(v+>TYw5j)ThZcQN-wt*#d6urvOPQTmT0spkmNRT=%VZ#Z;57EnVehxJ-yHe$}#O)&noY2wf z1ZrR;sGsMNghH5pqv9zYpSWO%anNww7=Hyv3lVR~bz3I(1s_spNM%M0e1U*Lx?R0H zmoko_A~`|1A`dYM%FS>?96jm|LcM&LK?UsPVMTH$l%TklD-Fx7*7RLf5N`FN+UW{{ znds_Xml;W7e~L-)aIB2-(fCRadxNPAl<6V(RerFxV44EV;AditS5*V0wqRN>rAW>= zP5!q7A8KG+yya9L`~hpPMON6G&XYLy*UDq@J#11zOkVx%ZI)Y%zO)!f*+fZ;u_(3} bdv>1>k(_!t9pJrb00000NkvXXu0mjfzqQBQ literal 0 HcmV?d00001 diff --git a/images/clockout_presensi.png b/images/clockout_presensi.png new file mode 100644 index 0000000000000000000000000000000000000000..89eb71d08dbfb0104779e2404f65632c7747f79e GIT binary patch literal 488 zcmVP)N78yb&;LJeiDBh`M`(Wwv%la%CciW8s- zn!FGrKSu8icq?m7yHLXzV{xzS#?dR5L| zP@cA~5yPk4Kwd8z+OpohB7f9dDSAt~1zTrGAFo|iQZF}9fW4{&0(PhVu(y|CY^qLT z*1W7)60v+24;U!?JaLoj(Fm5zC^H%Rg~B27g2D{t*~MjaNMbWUH?11_T3c!9sjNJe z!!!BAhqN$lhQGbj$&1T0tk&BceT&Wcd0I2xmE;}@rhkfrnPGt@Qmz=P@veTvY60}F e?}~Bc@c9OFmVZlKE%Ju|0000k+h|_%TR^St?$&@W1=QoIQ-9`gj86o zdv1zI(Nd{#4s7j~O3eYJ=R_up86+aOPRNJ3TOEn(eZX8^iE(+K^k~VxpC9u4@lpAo zpaFJ!rIlwYY_K~Q#7?n)r6GI7T~Cu#z-#2kQo=jno0$3*4guVS){qak)Wse`8C(N9 z*#I2KJ#N{$Z-^k(Eokjw^jL%v3zt)ruOKf@rGYnat`jni){qy*mk?U)?jSEpUxHUe zrqOV+ZQGGsG@JxQWEPFqmk_f7%q1GFFQI@4Xv*d3*1&{NukhA2b}K%0G+si9Q6e%J z8&9FcsP4o}xQg=`<1~~Z`eZj@G?t(Vc88@kj>jXU0ON1Nccnq)e}%S?R7cZs1dJf0 z8AU)(h(X=6_G(lCJs~{UA89hgs1^y^FFvd-nX|3msr3M?D2a4gdfE07*qoM6N<$f{{}zWdHyG literal 0 HcmV?d00001 diff --git a/images/presensi_finger1.png b/images/presensi_finger1.png new file mode 100644 index 0000000000000000000000000000000000000000..a280a0b8d2a79cf15e5f0bbd8df14a8c997e0a71 GIT binary patch literal 47314 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 literal 0 HcmV?d00001 diff --git a/images/presensi_finger2.png b/images/presensi_finger2.png new file mode 100644 index 0000000000000000000000000000000000000000..b5bb72c6e8636af55528e540cd537c6c1f4e925b GIT binary patch literal 3790 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 Eg3Ch?aR2}S literal 0 HcmV?d00001 diff --git a/images/sync_white.png b/images/sync_white.png new file mode 100644 index 0000000000000000000000000000000000000000..727de2837a33615b1ca38ef1df5638ff285a66b7 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`j)FbFd;%$g$s6l5$8 za(7}_cTVOdki(Mh=vDwxk9#NN&6Iv-c{!@u zaJ~Y!p?jK=Ec4~9U6s#zjtLjHr_U60Ymw@or@Z<45gD$}DTzl-L`vn@CWmRfJ9tG| zP_Z+0y{PS{OaX6h!&;7%D>J!1nVi@zvgVs9qp)@E;o8ebMHj2@Ik#}3zQ6d^-VFj% zwyx&r%c|qpDe{>&>Eqj#3!Zz5FVwNR{Oe$!>)gv+RfUVLuQp#0x$Yj{Pa)Cp^;|Ve wCYGp3tekkIF1}BkU+r11<;VB0v;K*duh+Sh!p8om8yE--p00i_>zopr0E1(KLI3~& literal 0 HcmV?d00001 diff --git a/lib/app/constant.dart b/lib/app/constant.dart index 0efe329..107e38b 100644 --- a/lib/app/constant.dart +++ b/lib/app/constant.dart @@ -19,6 +19,8 @@ class Constant { static Color textLightGrey = const Color(0xff919EAB); static Color textOrange = const Color(0xffF15A29); static Color textDarkGrey = const Color(0xff637381); + static Color bgAddressPresensi = const Color.fromRGBO(241, 90, 41, 0.08); + static Color textWhite = Color(0xffFDFDFD); // size convertion static double getActualXPhone({ @@ -57,6 +59,13 @@ class Constant { ); } + static TextStyle titleH2_400_12({required BuildContext context}) { + return TextStyle( + fontSize: Constant.getActualYPhone(context: context, y: 12), + fontWeight: FontWeight.w400, + fontFamily: 'Public Sans'); + } + static TextStyle titleH2_600_14({required BuildContext context}) { return TextStyle( fontSize: Constant.getActualYPhone(context: context, y: 14), @@ -79,6 +88,14 @@ class Constant { ); } + static TextStyle titlePresensiH2_700({required BuildContext context}) { + return TextStyle( + fontFamily: 'Quicksand', + fontSize: Constant.getActualYPhone(context: context, y: 24), + fontWeight: FontWeight.w700, + ); + } + static TextStyle time_700({required BuildContext context}) { return TextStyle( fontSize: Constant.getActualYPhone(context: context, y: 28), diff --git a/lib/app/route.dart b/lib/app/route.dart index c7d1069..f9bd7c3 100644 --- a/lib/app/route.dart +++ b/lib/app/route.dart @@ -1,4 +1,5 @@ import 'package:absensi_sas_flutter/screen/home/home_screen_v1.dart'; +import 'package:absensi_sas_flutter/screen/presensi/presensi_screen.dart'; import 'package:flutter/material.dart'; import '../screen/home/home_screen.dart'; import '../test_flutter_map.dart'; @@ -9,6 +10,7 @@ const loginRoute = "/loginRoute"; const splashRoute = "/splashRoute"; const testFlutterMapRoute = "/testFlutterMapRoute"; const homeRoute = "/homeRoute"; +const presensiRoute = "/presensiRoute"; class AppRoute { static Route generateRoute(RouteSettings settings) { @@ -35,6 +37,17 @@ class AppRoute { }); } + // presensi route + if (settings.name == presensiRoute) { + return MaterialPageRoute(builder: (context) { + return MediaQuery( + data: MediaQuery.of(context) + .copyWith(textScaleFactor: 1.0, padding: EdgeInsets.all(0)), + child: PresensiScreen(), + ); + }); + } + // splash screen if (settings.name == splashRoute) { return MaterialPageRoute(builder: (context) { diff --git a/lib/main.dart b/lib/main.dart index 52e66e5..ee89c99 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -46,7 +46,7 @@ class MyApp extends StatelessWidget { ), // home: TestMap(), // initialRoute: loginRoute, - initialRoute: homeRoute, + initialRoute: presensiRoute, // initialRoute: testFlutterMapRoute, onGenerateRoute: AppRoute.generateRoute, ); diff --git a/lib/screen/login/login_screen.dart b/lib/screen/login/login_screen.dart index 988b19d..093c903 100644 --- a/lib/screen/login/login_screen.dart +++ b/lib/screen/login/login_screen.dart @@ -163,27 +163,27 @@ class LoginScreen extends HookConsumerWidget { SizedBox( height: Constant.getActualYPhone(context: context, y: 100), ), - // (currentUserGoogle != null) - // ? Container( - // child: ListTile( - // leading: GoogleUserCircleAvatar( - // identity: currentUserGoogle, - // ), - // title: Text( - // currentUserGoogle.displayName ?? "", - // ), - // subtitle: Text( - // currentUserGoogle.email, - // ), - // trailing: IconButton( - // icon: Icon(Icons.logout_outlined), - // onPressed: () async { - // await googleSignIn.disconnect(); - // }, - // ), - // ), - // ) - // : + (currentUserGoogle != null) + ? Container( + child: ListTile( + leading: GoogleUserCircleAvatar( + identity: currentUserGoogle, + ), + title: Text( + currentUserGoogle.displayName ?? "", + ), + subtitle: Text( + currentUserGoogle.email, + ), + trailing: IconButton( + icon: Icon(Icons.logout_outlined), + onPressed: () async { + await googleSignIn.disconnect(); + }, + ), + ), + ) + : // Logo Landscape Padding( padding: EdgeInsets.only( diff --git a/lib/screen/presensi/presensi_screen.dart b/lib/screen/presensi/presensi_screen.dart new file mode 100644 index 0000000..3123056 --- /dev/null +++ b/lib/screen/presensi/presensi_screen.dart @@ -0,0 +1,438 @@ +import 'package:absensi_sas_flutter/widget/real_date.dart'; +import 'package:absensi_sas_flutter/widget/sankbar_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:geocoding/geocoding.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:permission_handler/permission_handler.dart'; + + +import '../../app/constant.dart'; +import '../../widget/real_time.dart'; + +class PresensiScreen extends HookConsumerWidget { + const PresensiScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final currentAddressUserLocation = useState(""); + final isLoadingAddressUserLocation = useState(false); + + Future getAddressFromLocation() async { + try { + isLoadingAddressUserLocation.value = true; + // Mendapatkan posisi pengguna + LocationPermission permission = await Geolocator.requestPermission(); + + if (permission == LocationPermission.denied) { + isLoadingAddressUserLocation.value = false; + SanckbarWidget(context, 'Izin lokasi ditolak', snackbarType.error); + // Handle jika pengguna menolak izin lokasi + print("Izin lokasi ditolak"); + return; + } + + Position position = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high); + + // Mendapatkan alamat dari posisi + List placemarks = await placemarkFromCoordinates( + position.latitude, position.longitude); + + if (placemarks.isNotEmpty) { + isLoadingAddressUserLocation.value = false; + Placemark placemark = placemarks.first; + // String address = + // "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},"; + + String address = + "${placemark.street}, ${placemark.subLocality}, ${placemark.subAdministrativeArea}, ${placemark.postalCode}"; + print("Alamat: $address"); + + if (address != "") { + currentAddressUserLocation.value = address; + } + } else { + isLoadingAddressUserLocation.value = false; + SanckbarWidget( + context, 'Tidak dapat menemukan alamat.', snackbarType.error); + print("Tidak dapat menemukan alamat."); + } + } catch (e) { + print("Error: $e"); + isLoadingAddressUserLocation.value = false; + SanckbarWidget(context, 'Error : $e', snackbarType.error); + } + } + + Future _requestLocationPermission() async { + var status = await Permission.location.request(); + isLoadingAddressUserLocation.value = true; + if (status.isGranted) { + // Izin diberikan, lanjutkan dengan mendapatkan lokasi + getAddressFromLocation(); + } else { + isLoadingAddressUserLocation.value = false; + // Izin ditolak, berikan pemberitahuan atau instruksi + // print('Izin lokasi ditolak'); + SanckbarWidget(context, 'Izin Ditolak', snackbarType.error); + } + } + + useEffect(() { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + getAddressFromLocation(); + }); + return () {}; + }, []); + + return Padding( + padding: EdgeInsets.only( + top: Constant.getActualYPhone(context: context, y: 30), + ), + child: Scaffold( + appBar: AppBar( + title: Text( + // 'Home Screen', + 'Presensi', + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Constant.textBlack, + ), + ), + backgroundColor: Constant.textWhite, + iconTheme: IconThemeData( + color: Constant.textBlack, + ), + // elevation: 1.0, + elevation: 0.5, + ), + body: SafeArea( + child: Padding( + padding: EdgeInsets.only( + top: Constant.getActualYPhone(context: context, y: 58), + left: Constant.getActualXPhone(context: context, x: 33), + right: Constant.getActualXPhone(context: context, x: 27), + ), + child: Container( + width: Constant.getActualXPhone(context: context, x: 390), + // height: Constant.getActualYPhone(context: context, y: 844), + height: MediaQuery.of(context).size.height, + child: Column( + children: [ + // Spacer(), + // tanggal sekarang + RealTimeFormattedDate(), + SizedBox( + height: Constant.getActualYPhone(context: context, y: 8), + ), + // jam sekarang + RealTimeClock(), + SizedBox( + height: Constant.getActualYPhone(context: context, y: 24), + ), + + // address dan refresh + Container( + width: Constant.getActualXPhone(context: context, x: 350), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + color: Constant.bgAddressPresensi, + ), + child: Padding( + padding: EdgeInsets.only( + left: Constant.getActualXPhone(context: context, x: 12), + right: + Constant.getActualXPhone(context: context, x: 12), + top: Constant.getActualYPhone(context: context, y: 12), + bottom: + Constant.getActualYPhone(context: context, y: 12), + ), + child: Row( + children: [ + // Bagian kiri + Padding( + padding: EdgeInsets.only(left: 12, right: 8), + child: Column( + children: [ + Icon( + Icons.location_on_outlined, + color: Constant.textDarkGrey, + ), + ], + ), + ), + + // Bagian tengah + Expanded( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 8), + child: Column( + children: [ + (isLoadingAddressUserLocation.value) + ? Center( + child: CircularProgressIndicator(), + ) + : Text( + // 'Perumahan Grand House of Klodran No. 5, Klodran, Kec. Colomadu, Kabupaten Karanganyar, Jawa Tengah 57172', + currentAddressUserLocation.value, + overflow: TextOverflow.ellipsis, + maxLines: 10, + style: Constant.titleH2_400_12( + context: context) + .copyWith( + color: Constant.textDarkGrey, + ), + ), + ], + ), + ), + ), + + // Bagian kanan + Padding( + padding: EdgeInsets.only(right: 12), + child: Column( + children: [ + InkWell( + onTap: () async { + getAddressFromLocation(); + }, + child: Container( + width: Constant.getActualXPhone( + context: context, x: 36), + height: Constant.getActualYPhone( + context: context, y: 36), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Constant.textOrange, + ), + child: Image.asset( + 'images/sync_white.png', // Path gambar untuk "Refresh" + width: Constant.getActualXPhone( + context: context, x: 20), + height: Constant.getActualYPhone( + context: context, y: 20), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + + SizedBox( + height: Constant.getActualYPhone(context: context, y: 50), + ), + + // gambar icon presensi + Container( + width: Constant.getActualXPhone(context: context, x: 130), + height: Constant.getActualYPhone(context: context, y: 130), + child: FittedBox( + child: FloatingActionButton( + onPressed: () {}, + backgroundColor: Color(0xFFFFFFFF), + shape: CircleBorder(), + child: Container( + width: Constant.getActualXPhone( + context: context, x: 130), + height: Constant.getActualYPhone( + context: context, y: 130), + decoration: BoxDecoration( + image: DecorationImage( + // fit: BoxFit.cover, + image: AssetImage( + 'images/presensi_finger2.png'), // Ganti dengan path gambar Anda + ), + ), + ), + ), + ), + ), + + // Container( + // width: Constant.getActualXPhone(context: context, x: 100), + // height: Constant.getActualYPhone(context: context, y: 200), + // decoration: BoxDecoration( + // image: DecorationImage( + // fit: BoxFit.cover, + // image: AssetImage( + // 'images/presensi_finger1.png'), // Ganti dengan path gambar Anda + // ), + // ), + // ), + + Spacer(), + + // Expanded( + // child: SizedBox(), + // ), + + // clock in & clock out + Padding( + padding: EdgeInsets.only( + left: Constant.getActualXPhone(context: context, x: 70), + right: Constant.getActualXPhone(context: context, x: 70), + // top: + // Constant.getActualYPhone(context: context, y: 12), + bottom: Constant.getActualYPhone(context: context, y: 55), + ), + child: Container( + width: Constant.getActualXPhone(context: context, x: 390), + // color: Colors.amber, + child: Row( + children: [ + Column( + children: [ + Image.asset( + 'images/clockin_presensi.png', // Path gambar untuk "Clock In" + width: Constant.getActualXPhone( + context: context, x: 22), + height: Constant.getActualYPhone( + context: context, y: 22), + ), + SizedBox( + height: Constant.getActualYPhone( + context: context, y: 8), + ), + Text( + '--:--', + style: Constant.titlePresensiH2_700( + context: context) + .copyWith( + color: Constant.textTrueBlack, + ), + ), + Text( + 'Clock In', + style: Constant.titleH2_700(context: context) + .copyWith( + color: Constant.textTrueBlack, + ), + ), + ], + ), + Spacer(), + Column( + children: [ + Image.asset( + 'images/clockout_presensi.png', // Path gambar untuk "Check In" + width: Constant.getActualXPhone( + context: context, x: 22), + height: Constant.getActualYPhone( + context: context, y: 22), + ), + SizedBox( + height: Constant.getActualYPhone( + context: context, y: 8), + ), + Text( + '--:--', + style: Constant.titlePresensiH2_700( + context: context) + .copyWith( + color: Constant.textTrueBlack, + ), + ), + Text( + 'Clock Out', + style: Constant.titleH2_700(context: context) + .copyWith( + color: Constant.textTrueBlack, + ), + ), + ], + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + // bottomNavigationBar: Container( + // width: Constant.getActualXPhone(context: context, x: 390), + // height: Constant.getActualYPhone(context: context, y: 84), + // decoration: BoxDecoration( + // color: Color(0xFFFFFFFF), + // boxShadow: [ + // BoxShadow( + // offset: Offset(0, -1), + // blurRadius: 8, + // spreadRadius: -8, + // color: Color.fromRGBO(0, 0, 0, 0.10), + // ), + // ], + // ), + // child: Row( + // children: [ + // Expanded( + // child: Container( + // child: Column( + // children: [ + // Image.asset( + // 'images/clockin_presensi.png', // Path gambar untuk "Clock In" + // width: Constant.getActualXPhone(context: context, x: 22), + // height: Constant.getActualYPhone(context: context, y: 22), + // ), + // SizedBox( + // height: Constant.getActualYPhone(context: context, y: 8), + // ), + // Text( + // '--:--', + // style: Constant.titlePresensiH2_700(context: context) + // .copyWith( + // color: Constant.textTrueBlack, + // ), + // ), + // Text( + // 'Clock In', + // style: Constant.titleH2_700(context: context).copyWith( + // color: Constant.textTrueBlack, + // ), + // ), + // ], + // ), + // )), + // Expanded( + // child: Container( + // child: Column( + // children: [ + // Image.asset( + // 'images/clockout_presensi.png', // Path gambar untuk "Check In" + // width: Constant.getActualXPhone(context: context, x: 22), + // height: Constant.getActualYPhone(context: context, y: 22), + // ), + // SizedBox( + // height: Constant.getActualYPhone(context: context, y: 8), + // ), + // Text( + // '--:--', + // style: Constant.titlePresensiH2_700(context: context) + // .copyWith( + // color: Constant.textTrueBlack, + // ), + // ), + // Text( + // 'Clock Out', + // style: Constant.titleH2_700(context: context).copyWith( + // color: Constant.textTrueBlack, + // ), + // ), + // ], + // ), + // )), + // ], + // ), + // ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 6780abe..732bac8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -576,6 +576,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.1" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8" + url: "https://pub.dev" + source: hosted + version: "11.0.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: f9fddd3b46109bd69ff3f9efa5006d2d309b7aec0f3c1c5637a60a2d5659e76e + url: "https://pub.dev" + source: hosted + version: "11.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5" + url: "https://pub.dev" + source: hosted + version: "9.1.4" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" + url: "https://pub.dev" + source: hosted + version: "3.12.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098 + url: "https://pub.dev" + source: hosted + version: "0.1.3" pigeon: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 2237c6c..82db703 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,6 +51,7 @@ dependencies: intl: ^0.17.0 graphql: ^5.1.3 top_snackbar_flutter: ^3.1.0 + permission_handler: ^11.0.0 dev_dependencies: flutter_test: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 1ece8f2..5be7b60 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -7,8 +7,11 @@ #include "generated_plugin_registrant.h" #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { GeolocatorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("GeolocatorWindows")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 7f101a7..b949ced 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST geolocator_windows + permission_handler_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST