set up google auth
This commit is contained in:
parent
df2b51aee9
commit
c472181d14
|
|
@ -1,8 +1,9 @@
|
|||
plugins {
|
||||
id("com.android.application")
|
||||
id("kotlin-android")
|
||||
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
||||
id("dev.flutter.flutter-gradle-plugin")
|
||||
// اضافه کردن پلاگin گوگل سرویسز برای فایربیس
|
||||
id("com.google.gms.google-services")
|
||||
}
|
||||
|
||||
android {
|
||||
|
|
@ -11,19 +12,20 @@ android {
|
|||
ndkVersion = flutter.ndkVersion
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
// فلاتر به صورت پیشفرض از جاوا ۸ استفاده میکند.
|
||||
// اگر به صورت دستی به ۱۱ تغییر دادهاید، مشکلی نیست.
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = JavaVersion.VERSION_11.toString()
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId = "com.example.lba"
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
||||
// حداقل SDK برای کتابخانههای جدید فایربیس معمولاً ۲۱ است.
|
||||
// ۲۴ که شما تنظیم کردهاید کاملاً مناسب است.
|
||||
minSdk = 24
|
||||
targetSdk = flutter.targetSdkVersion
|
||||
versionCode = flutter.versionCode
|
||||
|
|
@ -32,11 +34,11 @@ android {
|
|||
|
||||
buildTypes {
|
||||
release {
|
||||
// TODO: Add your own signing config for the release build.
|
||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
||||
signingConfig = signingConfigs.getByName("debug")
|
||||
isMinifyEnabled = false
|
||||
isShrinkResources = false
|
||||
// این تنظیمات برای نسخه نهایی (release) مهم هستند
|
||||
// اما برای تست میتوانید آنها را غیرفعال نگه دارید.
|
||||
// isMinifyEnabled = true
|
||||
// isShrinkResources = true
|
||||
// proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
|
||||
}
|
||||
}
|
||||
|
|
@ -45,3 +47,17 @@ android {
|
|||
flutter {
|
||||
source = "../.."
|
||||
}
|
||||
|
||||
// اضافه کردن این بخش برای کتابخانههای فایربیس
|
||||
dependencies {
|
||||
// اضافه کردن Firebase Bill of Materials (BoM)
|
||||
// این کار نسخههای تمام کتابخانههای فایربیس را مدیریت میکند
|
||||
implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
|
||||
|
||||
// کتابخانههای مورد نیاز برای آنالیتیکس و احراز هویت
|
||||
implementation("com.google.firebase:firebase-analytics")
|
||||
implementation("com.google.firebase:firebase-auth")
|
||||
|
||||
// کتابخانه مورد نیاز برای پکیج google_sign_in
|
||||
implementation("com.google.android.gms:play-services-auth:21.2.0")
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
{
|
||||
"project_info": {
|
||||
"project_number": "81202355575",
|
||||
"project_id": "lba-app-c4a7e",
|
||||
"storage_bucket": "lba-app-c4a7e.firebasestorage.app"
|
||||
},
|
||||
"client": [
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:81202355575:android:6d4c7db49b6120f8239572",
|
||||
"android_client_info": {
|
||||
"package_name": "com.example.lba"
|
||||
}
|
||||
},
|
||||
"oauth_client": [
|
||||
{
|
||||
"client_id": "81202355575-fchlrrp4fu3irskh6co1ep8i04oi3adr.apps.googleusercontent.com",
|
||||
"client_type": 1,
|
||||
"android_info": {
|
||||
"package_name": "com.example.lba",
|
||||
"certificate_hash": "b64c77112af5000772d60fbe05138e873f6fc118"
|
||||
}
|
||||
},
|
||||
{
|
||||
"client_id": "81202355575-toafncrkf106nnu2g7hmqh2gho491gjt.apps.googleusercontent.com",
|
||||
"client_type": 3
|
||||
}
|
||||
],
|
||||
"api_key": [
|
||||
{
|
||||
"current_key": "AIzaSyB22NqmwB_PpI1s37xbc2ABJ5_COEHeC8g"
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
"appinvite_service": {
|
||||
"other_platform_oauth_client": [
|
||||
{
|
||||
"client_id": "81202355575-toafncrkf106nnu2g7hmqh2gho491gjt.apps.googleusercontent.com",
|
||||
"client_type": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"configuration_version": "1"
|
||||
}
|
||||
|
|
@ -10,6 +10,7 @@
|
|||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
|
||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||
<application
|
||||
android:label="lba"
|
||||
android:name="${applicationName}"
|
||||
|
|
|
|||
|
|
@ -19,3 +19,14 @@ subprojects {
|
|||
tasks.register<Delete>("clean") {
|
||||
delete(rootProject.layout.buildDirectory)
|
||||
}
|
||||
|
||||
plugins {
|
||||
// The Flutter Gradle Plugin is managed by the Flutter SDK, so we don't specify a version.
|
||||
id("dev.flutter.flutter-gradle-plugin") apply false
|
||||
// The Android Gradle Plugin version is also managed, so we remove the explicit version.
|
||||
id("com.android.application") apply false
|
||||
// The Kotlin plugin version is also managed.
|
||||
id("org.jetbrains.kotlin.android") apply false
|
||||
// اضافه کردن این خط برای تعریف پلاگین گوگل سرویسز
|
||||
id("com.google.gms.google-services") version "4.4.1" apply false
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
org.gradle.java.home=D:/Program Files/Android/Android Studio/jbr
|
||||
|
|
@ -19,7 +19,8 @@ pluginManagement {
|
|||
plugins {
|
||||
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
|
||||
id("com.android.application") version "8.7.0" apply false
|
||||
id("org.jetbrains.kotlin.android") version "1.8.22" apply false
|
||||
// Updated Kotlin version to the latest stable release
|
||||
id("org.jetbrains.kotlin.android") version "2.0.0" apply false
|
||||
}
|
||||
|
||||
include(":app")
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<svg width="19" height="18" viewBox="0 0 19 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2 6.37866H17" stroke="#9D9D9B" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M5 12.3787H6.5" stroke="#9D9D9B" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M8.375 12.3787H11.375" stroke="#9D9D9B" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M5.33 2.62866H13.6625C16.3325 2.62866 17 3.28866 17 5.92116V12.0787C17 14.7112 16.3325 15.3712 13.67 15.3712H5.33C2.6675 15.3787 2 14.7187 2 12.0862V5.92116C2 3.28866 2.6675 2.62866 5.33 2.62866Z" stroke="#9D9D9B" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 723 B |
|
|
@ -1,4 +1,6 @@
|
|||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:google_sign_in/google_sign_in.dart';
|
||||
import 'package:firebase_auth/firebase_auth.dart';
|
||||
import '../../domain/usecases/send_otp.dart';
|
||||
import '../../domain/usecases/verify_otp.dart';
|
||||
|
||||
|
|
@ -8,6 +10,7 @@ part 'auth_state.dart';
|
|||
class AuthBloc extends Bloc<AuthEvent, AuthState> {
|
||||
final SendOTP sendOTPUseCase;
|
||||
final VerifyOTP verifyOTPUseCase;
|
||||
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
|
||||
|
||||
String _timeStamp = "";
|
||||
String _timeDue = "";
|
||||
|
|
@ -21,13 +24,12 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
|
|||
}) : super(AuthInitial()) {
|
||||
on<SendOTPEvent>(_onSendOTP);
|
||||
on<VerifyOTPEvent>(_onVerifyOTP);
|
||||
on<SignInWithGoogleEvent>(_onSignInWithGoogle);
|
||||
}
|
||||
|
||||
Future<void> _onSendOTP(SendOTPEvent event, Emitter<AuthState> emit) async {
|
||||
emit(AuthLoading());
|
||||
|
||||
final result = await sendOTPUseCase(SendOTPParams(phoneNumber: event.phoneNumber));
|
||||
|
||||
if (result.isSuccess && result.data != null) {
|
||||
_timeStamp = result.data!.timeStamp;
|
||||
_timeDue = result.data!.timeDue;
|
||||
|
|
@ -37,22 +39,59 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
|
|||
timeDue: _timeDue,
|
||||
));
|
||||
} else {
|
||||
emit(AuthError('خطا در ارسال کد. لطفاً دوباره تلاش کنید.'));
|
||||
emit(AuthError('Error sending code. Please try again.'));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _onVerifyOTP(VerifyOTPEvent event, Emitter<AuthState> emit) async {
|
||||
emit(AuthLoading());
|
||||
|
||||
final result = await verifyOTPUseCase(VerifyOTPParams(
|
||||
otpCode: event.otpCode,
|
||||
phoneNumber: event.phoneNumber,
|
||||
));
|
||||
|
||||
if (result.isSuccess && result.data == true) {
|
||||
emit(OTPVerified());
|
||||
} else {
|
||||
emit(AuthError('کد وارد شده نادرست است. لطفاً دوباره تلاش کنید.'));
|
||||
emit(AuthError('The code entered is incorrect. Please try again.'));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _onSignInWithGoogle(
|
||||
SignInWithGoogleEvent event,
|
||||
Emitter<AuthState> emit,
|
||||
) async {
|
||||
emit(AuthLoading());
|
||||
try {
|
||||
final GoogleSignIn googleSignIn = GoogleSignIn(
|
||||
scopes: ['email'],
|
||||
);
|
||||
|
||||
final GoogleSignInAccount? googleUser = await googleSignIn.signIn();
|
||||
|
||||
if (googleUser == null) {
|
||||
emit(AuthInitial());
|
||||
return;
|
||||
}
|
||||
|
||||
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
|
||||
|
||||
final credential = GoogleAuthProvider.credential(
|
||||
accessToken: googleAuth.accessToken,
|
||||
idToken: googleAuth.idToken,
|
||||
);
|
||||
|
||||
final UserCredential userCredential =
|
||||
await _firebaseAuth.signInWithCredential(credential);
|
||||
|
||||
if (userCredential.user != null) {
|
||||
emit(GoogleSignInSuccess());
|
||||
} else {
|
||||
emit(AuthError("Error signing in with Google"));
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
emit(AuthError("Error signing in with Google: ${e.toString()}"));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -17,3 +17,5 @@ class VerifyOTPEvent extends AuthEvent {
|
|||
required this.phoneNumber,
|
||||
});
|
||||
}
|
||||
|
||||
class SignInWithGoogleEvent extends AuthEvent {}
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
// lib/features/auth/presentation/bloc/auth_state.dart
|
||||
part of 'auth_bloc.dart';
|
||||
|
||||
abstract class AuthState {}
|
||||
|
|
@ -9,9 +8,6 @@ class AuthLoading extends AuthState {}
|
|||
|
||||
class AuthSuccess extends AuthState {
|
||||
final String phoneNumber;
|
||||
//
|
||||
// CHANGE: Made timeStamp and timeDue required.
|
||||
//
|
||||
final String timeStamp;
|
||||
final String timeDue;
|
||||
|
||||
|
|
@ -29,3 +25,5 @@ class AuthError extends AuthState {
|
|||
}
|
||||
|
||||
class OTPVerified extends AuthState {}
|
||||
|
||||
class GoogleSignInSuccess extends AuthState {}
|
||||
|
|
@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:country_pickers/country_pickers.dart';
|
||||
import 'package:lba/features/auth/presentation/pages/user_info_page.dart';
|
||||
import '../../../../extension/screenSize.dart';
|
||||
import '../../../../gen/assets.gen.dart';
|
||||
import '../bloc/auth_bloc.dart';
|
||||
|
|
@ -167,6 +168,14 @@ class _LoginPageState extends State<LoginPage> {
|
|||
),
|
||||
);
|
||||
}
|
||||
if (state is GoogleSignInSuccess) {
|
||||
Navigator.pushReplacement(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => const UserInfoPage(),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (state is AuthError) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
|
|
@ -242,7 +251,9 @@ class _LoginPageState extends State<LoginPage> {
|
|||
borderRadius: BorderRadius.circular(32),
|
||||
),
|
||||
),
|
||||
onPressed: () {},
|
||||
onPressed: () {
|
||||
context.read<AuthBloc>().add(SignInWithGoogleEvent());
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
// dart format width=80
|
||||
|
||||
/// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
/// *****************************************************
|
||||
/// FlutterGen
|
||||
|
|
@ -5,7 +7,7 @@
|
|||
|
||||
// coverage:ignore-file
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use
|
||||
// ignore_for_file: deprecated_member_use,directives_ordering,implicit_dynamic_list_literal,unnecessary_import
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
|
@ -93,6 +95,9 @@ class $AssetsIconsGen {
|
|||
/// File path: assets/icons/card-pos.svg
|
||||
SvgGenImage get cardPos => const SvgGenImage('assets/icons/card-pos.svg');
|
||||
|
||||
/// File path: assets/icons/card.svg
|
||||
SvgGenImage get card => const SvgGenImage('assets/icons/card.svg');
|
||||
|
||||
/// File path: assets/icons/category-2.svg
|
||||
SvgGenImage get category2 => const SvgGenImage('assets/icons/category-2.svg');
|
||||
|
||||
|
|
@ -367,6 +372,7 @@ class $AssetsIconsGen {
|
|||
camera2,
|
||||
cardAdd,
|
||||
cardPos,
|
||||
card,
|
||||
category2,
|
||||
checkAlternative,
|
||||
clander,
|
||||
|
|
@ -506,12 +512,18 @@ class Assets {
|
|||
}
|
||||
|
||||
class AssetGenImage {
|
||||
const AssetGenImage(this._assetName, {this.size, this.flavors = const {}});
|
||||
const AssetGenImage(
|
||||
this._assetName, {
|
||||
this.size,
|
||||
this.flavors = const {},
|
||||
this.animation,
|
||||
});
|
||||
|
||||
final String _assetName;
|
||||
|
||||
final Size? size;
|
||||
final Set<String> flavors;
|
||||
final AssetGenImageAnimation? animation;
|
||||
|
||||
Image image({
|
||||
Key? key,
|
||||
|
|
@ -575,6 +587,18 @@ class AssetGenImage {
|
|||
String get keyName => _assetName;
|
||||
}
|
||||
|
||||
class AssetGenImageAnimation {
|
||||
const AssetGenImageAnimation({
|
||||
required this.isAnimation,
|
||||
required this.duration,
|
||||
required this.frames,
|
||||
});
|
||||
|
||||
final bool isAnimation;
|
||||
final Duration duration;
|
||||
final int frames;
|
||||
}
|
||||
|
||||
class SvgGenImage {
|
||||
const SvgGenImage(this._assetName, {this.size, this.flavors = const {}})
|
||||
: _isVecFormat = false;
|
||||
|
|
@ -601,6 +625,7 @@ class SvgGenImage {
|
|||
String? semanticsLabel,
|
||||
bool excludeFromSemantics = false,
|
||||
_svg.SvgTheme? theme,
|
||||
_svg.ColorMapper? colorMapper,
|
||||
ColorFilter? colorFilter,
|
||||
Clip clipBehavior = Clip.hardEdge,
|
||||
@deprecated Color? color,
|
||||
|
|
@ -620,6 +645,7 @@ class SvgGenImage {
|
|||
assetBundle: bundle,
|
||||
packageName: package,
|
||||
theme: theme,
|
||||
colorMapper: colorMapper,
|
||||
);
|
||||
}
|
||||
return _svg.SvgPicture(
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
// dart format width=80
|
||||
/// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
/// *****************************************************
|
||||
/// FlutterGen
|
||||
|
|
@ -5,7 +6,7 @@
|
|||
|
||||
// coverage:ignore-file
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use
|
||||
// ignore_for_file: deprecated_member_use,directives_ordering,implicit_dynamic_list_literal,unnecessary_import
|
||||
|
||||
class FontFamily {
|
||||
FontFamily._();
|
||||
|
|
|
|||
|
|
@ -5,8 +5,11 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
|||
import 'features/auth/presentation/pages/onboarding_page.dart';
|
||||
import 'widgets/animated_splash_screen.dart';
|
||||
import 'injection_container.dart';
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
|
||||
void main() {
|
||||
Future<void> main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
await Firebase.initializeApp();
|
||||
sl.init();
|
||||
runApp(const MyApp());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import 'package:flutter_sound/flutter_sound.dart';
|
|||
import 'package:audioplayers/audioplayers.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:vibration/vibration.dart';
|
||||
|
||||
class Planner extends StatefulWidget {
|
||||
const Planner({super.key});
|
||||
|
|
@ -236,11 +237,31 @@ class _PlannerState extends State<Planner> with TickerProviderStateMixin {
|
|||
|
||||
Future<void> _startRecording() async {
|
||||
try {
|
||||
HapticFeedback.mediumImpact();
|
||||
debugPrint('🎤 Starting recording...');
|
||||
|
||||
try {
|
||||
debugPrint('📳 Attempting vibration...');
|
||||
|
||||
bool? hasVibrator = await Vibration.hasVibrator();
|
||||
debugPrint('🔍 Device has vibrator: $hasVibrator');
|
||||
|
||||
if (hasVibrator == true) {
|
||||
await Vibration.vibrate(duration: 100);
|
||||
debugPrint('✅ Vibration pattern done');
|
||||
}
|
||||
|
||||
await HapticFeedback.heavyImpact();
|
||||
debugPrint('✅ Heavy impact done');
|
||||
|
||||
} catch (e) {
|
||||
debugPrint('❌ Vibration error: $e');
|
||||
}
|
||||
|
||||
final permission = await Permission.microphone.request();
|
||||
debugPrint('🎙️ Microphone permission status: $permission');
|
||||
|
||||
if (permission != PermissionStatus.granted) {
|
||||
debugPrint('❌ Microphone permission denied');
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(
|
||||
content: Text(
|
||||
|
|
@ -250,6 +271,7 @@ class _PlannerState extends State<Planner> with TickerProviderStateMixin {
|
|||
}
|
||||
|
||||
if (_audioRecorder == null) {
|
||||
debugPrint('🔧 Initializing recorder...');
|
||||
await _initRecorder();
|
||||
}
|
||||
|
||||
|
|
@ -257,12 +279,14 @@ class _PlannerState extends State<Planner> with TickerProviderStateMixin {
|
|||
await getApplicationDocumentsDirectory();
|
||||
final String filePath =
|
||||
'${appDocumentsDir.path}/recording_${DateTime.now().millisecondsSinceEpoch}.aac';
|
||||
debugPrint('📁 Recording to: $filePath');
|
||||
|
||||
await _audioRecorder!.startRecorder(
|
||||
toFile: filePath,
|
||||
codec: Codec.aacADTS,
|
||||
);
|
||||
|
||||
debugPrint('✅ Recording started successfully');
|
||||
setState(() {
|
||||
_isRecording = true;
|
||||
_recordDuration = Duration.zero;
|
||||
|
|
@ -270,22 +294,44 @@ class _PlannerState extends State<Planner> with TickerProviderStateMixin {
|
|||
|
||||
_startRecordTimer();
|
||||
} catch (e) {
|
||||
debugPrint('Error starting recording: $e');
|
||||
debugPrint('❌ Error starting recording: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _stopRecording() async {
|
||||
try {
|
||||
HapticFeedback.lightImpact();
|
||||
debugPrint('🛑 Stopping recording...');
|
||||
|
||||
try {
|
||||
debugPrint('📳 Attempting stop vibration...');
|
||||
|
||||
bool? hasVibrator = await Vibration.hasVibrator();
|
||||
debugPrint('🔍 Device has vibrator: $hasVibrator');
|
||||
|
||||
if (hasVibrator == true) {
|
||||
await Vibration.vibrate(duration: 50);
|
||||
await Future.delayed(Duration(milliseconds: 100));
|
||||
await Vibration.vibrate(duration: 50);
|
||||
debugPrint('✅ Double vibration done');
|
||||
}
|
||||
|
||||
await HapticFeedback.lightImpact();
|
||||
debugPrint('✅ Light impact done');
|
||||
|
||||
} catch (e) {
|
||||
debugPrint('❌ Stop vibration error: $e');
|
||||
}
|
||||
|
||||
_recordingTimer?.cancel();
|
||||
final path = await _audioRecorder!.stopRecorder();
|
||||
debugPrint('✅ Recording stopped. Path: $path');
|
||||
|
||||
setState(() {
|
||||
_isRecording = false;
|
||||
_recordedAudioPath = path;
|
||||
});
|
||||
} catch (e) {
|
||||
debugPrint('Error stopping recording: $e');
|
||||
debugPrint('❌ Error stopping recording: $e');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1046,8 +1092,29 @@ class _PlannerState extends State<Planner> with TickerProviderStateMixin {
|
|||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onLongPressStart: (_) => _startRecording(),
|
||||
onLongPressEnd: (_) => _stopRecording(),
|
||||
onLongPressStart: (_) {
|
||||
debugPrint('🔴 Long press started');
|
||||
_startRecording();
|
||||
},
|
||||
onLongPressEnd: (_) {
|
||||
debugPrint('🔴 Long press ended');
|
||||
_stopRecording();
|
||||
},
|
||||
onTap: () async {
|
||||
debugPrint('👆 Mic tapped for test');
|
||||
try {
|
||||
bool? hasVibrator = await Vibration.hasVibrator();
|
||||
debugPrint('🔍 Device vibration support: $hasVibrator');
|
||||
if (hasVibrator == true) {
|
||||
await Vibration.vibrate(duration: 200);
|
||||
debugPrint('✅ Test vibration completed');
|
||||
}
|
||||
await HapticFeedback.heavyImpact();
|
||||
debugPrint('✅ Test haptic completed');
|
||||
} catch (e) {
|
||||
debugPrint('❌ Test vibration error: $e');
|
||||
}
|
||||
},
|
||||
child: AnimatedBuilder(
|
||||
animation: _micPulseAnimation,
|
||||
builder: (context, child) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:lba/res/colors.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:lba/gen/assets.gen.dart';
|
||||
import 'package:lba/widgets/button.dart';
|
||||
|
||||
class AddCardBottomSheet extends StatefulWidget {
|
||||
|
|
@ -26,7 +27,6 @@ class _AddCardBottomSheetState extends State<AddCardBottomSheet> {
|
|||
_cardNumberController.addListener(_validateCardNumber);
|
||||
_expiryDateController.addListener(_validateExpiryDate);
|
||||
|
||||
// Change border color on focus
|
||||
_cardNumberFocus.addListener(() {
|
||||
setState(() {
|
||||
_borderColor = _cardNumberFocus.hasFocus || _expiryDateFocus.hasFocus
|
||||
|
|
@ -118,7 +118,7 @@ class _AddCardBottomSheetState extends State<AddCardBottomSheet> {
|
|||
style: TextStyle(
|
||||
fontSize: 22,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black87,
|
||||
color: Color.fromARGB(255, 85,84, 81),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
|
|
@ -133,9 +133,9 @@ class _AddCardBottomSheetState extends State<AddCardBottomSheet> {
|
|||
),
|
||||
child: Row(
|
||||
children: [
|
||||
const Padding(
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 12.0),
|
||||
child: Icon(Icons.credit_card, color: Colors.grey),
|
||||
child: SvgPicture.asset(Assets.icons.card.path, width: 24, height: 24),
|
||||
),
|
||||
Expanded(
|
||||
child: TextFormField(
|
||||
|
|
|
|||
|
|
@ -6,22 +6,32 @@ import FlutterMacOS
|
|||
import Foundation
|
||||
|
||||
import audioplayers_darwin
|
||||
import device_info_plus
|
||||
import file_selector_macos
|
||||
import firebase_auth
|
||||
import firebase_core
|
||||
import geolocator_apple
|
||||
import google_sign_in_ios
|
||||
import location
|
||||
import maps_launcher
|
||||
import mobile_scanner
|
||||
import package_info_plus
|
||||
import path_provider_foundation
|
||||
import shared_preferences_foundation
|
||||
import url_launcher_macos
|
||||
|
||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||
AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin"))
|
||||
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
||||
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
|
||||
FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin"))
|
||||
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
|
||||
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
|
||||
FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin"))
|
||||
LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin"))
|
||||
MapsLauncherPlugin.register(with: registry.registrar(forPlugin: "MapsLauncherPlugin"))
|
||||
MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
|
||||
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||
|
|
|
|||
368
pubspec.lock
368
pubspec.lock
|
|
@ -5,18 +5,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f
|
||||
sha256: f0bb5d1648339c8308cc0b9838d8456b3cfe5c91f9dc1a735b4d003269e5da9a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "82.0.0"
|
||||
version: "88.0.0"
|
||||
_flutterfire_internals:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _flutterfire_internals
|
||||
sha256: bb84ee51e527053dd8e25ecc9f97a6abfdc19130fb4d883e4e8585e23e7e6dd8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.60"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: "13c1e6c6fd460522ea840abec3f677cc226f5fec7872c04ad7b425517ccf54f7"
|
||||
sha256: "0b7b9c329d2879f8f05d6c05b32ee9ec025f39b077864bdb5ac9a7b63418a98f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.4.4"
|
||||
version: "8.1.1"
|
||||
archive:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -117,18 +125,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: build
|
||||
sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
|
||||
sha256: "6439a9c71a4e6eca8d9490c1b380a25b02675aa688137dfbe66d2062884a23ac"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.2"
|
||||
version: "3.0.2"
|
||||
build_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_config
|
||||
sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
|
||||
sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
version: "1.2.0"
|
||||
build_daemon:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -141,26 +149,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: build_resolvers
|
||||
sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0
|
||||
sha256: "2b21a125d66a86b9511cc3fb6c668c42e9a1185083922bf60e46d483a81a9712"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.4"
|
||||
version: "3.0.2"
|
||||
build_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: build_runner
|
||||
sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99"
|
||||
sha256: fd3c09f4bbff7fa6e8d8ef688a0b2e8a6384e6483a25af0dac75fef362bcfe6f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.15"
|
||||
version: "2.7.0"
|
||||
build_runner_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_runner_core
|
||||
sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021"
|
||||
sha256: ab27e46c8aa233e610cf6084ee6d8a22c6f873a0a9929241d8855b7a72978ae7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.0"
|
||||
version: "9.3.0"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -173,10 +181,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: built_value
|
||||
sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4
|
||||
sha256: ba95c961bafcd8686d1cf63be864eb59447e795e124d98d6a27d91fcd13602fb
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.9.5"
|
||||
version: "8.11.1"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -273,14 +281,22 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
dart_polylabel2:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dart_polylabel2
|
||||
sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dart_style
|
||||
sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac"
|
||||
sha256: c87dfe3d56f183ffe9106a18aebc6db431fc7c98c31a54b952a77f3d54a85697
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
version: "3.1.2"
|
||||
dartx:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -289,14 +305,38 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
dbus:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dbus
|
||||
sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.11"
|
||||
device_info_plus:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: device_info_plus
|
||||
sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "11.5.0"
|
||||
device_info_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: device_info_plus_platform_interface
|
||||
sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.3"
|
||||
dio:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: dio
|
||||
sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9"
|
||||
sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.8.0+1"
|
||||
version: "5.9.0"
|
||||
dio_web_adapter:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -369,6 +409,54 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.3+4"
|
||||
firebase_auth:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_auth
|
||||
sha256: abd15b7287285390c4ac144fed7825a1877496366e0d15ffc0ddfa9774deb3f3
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.1"
|
||||
firebase_auth_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_auth_platform_interface
|
||||
sha256: c1d8a2f40980fbae191598e80431dd1228ddaeba17f96f4fe14babab721bdf3d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.1.0"
|
||||
firebase_auth_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_auth_web
|
||||
sha256: "337e01f3bb30de85b74634c33712c57f76cc15f7be9d35b24aab9e95e451a4e2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.1"
|
||||
firebase_core:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_core
|
||||
sha256: "6b343e6f7b72a4f32d7ce8df8c9a28d8f54b4ac20d7c6500f3e8b3969afca457"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
firebase_core_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_core_platform_interface
|
||||
sha256: "5dbc900677dcbe5873d22ad7fbd64b047750124f1f9b7ebe2a33b9ddccc838eb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.0"
|
||||
firebase_core_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_core_web
|
||||
sha256: "5d28b14dd32282fb7ce2b22b897362453755b6b8541d491127dc72b755bb7b16"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -386,26 +474,26 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_bloc
|
||||
sha256: "1046d719fbdf230330d3443187cc33cc11963d15c9089f6cc56faa42a4c5f0cc"
|
||||
sha256: cf51747952201a455a1c840f8171d273be009b932c75093020f9af64f2123e38
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.1.0"
|
||||
version: "9.1.1"
|
||||
flutter_gen_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_gen_core
|
||||
sha256: "3eaa2d3d8be58267ac4cd5e215ac965dd23cae0410dc073de2e82e227be32bfc"
|
||||
sha256: eda54fdc5de08e7eeea663eb8442aafc8660b5a13fda4e0c9e572c64e50195fb
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.10.0"
|
||||
version: "5.11.0"
|
||||
flutter_gen_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: flutter_gen_runner
|
||||
sha256: e74b4ead01df3e8f02e73a26ca856759dbbe8cb3fd60941ba9f4005cd0cd19c9
|
||||
sha256: "669bf8b7a9b4acbdcb7fcc5e12bf638aca19acedf43341714cbca3bf3a219521"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.10.0"
|
||||
version: "5.11.0"
|
||||
flutter_lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
|
|
@ -418,10 +506,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_map
|
||||
sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a
|
||||
sha256: df33e784b09fae857c6261a5521dd42bd4d3342cb6200884bb70730638af5fd5
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.1.1"
|
||||
version: "8.2.1"
|
||||
flutter_plugin_android_lifecycle:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -458,10 +546,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_svg
|
||||
sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1
|
||||
sha256: cd57f7969b4679317c17af6fd16ee233c1e60a82ed209d8a475c54fd6fd6f845
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
version: "2.2.0"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
|
|
@ -480,22 +568,30 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
geoclue:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: geoclue
|
||||
sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.1"
|
||||
geolocator:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: geolocator
|
||||
sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822
|
||||
sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.0.0"
|
||||
version: "14.0.2"
|
||||
geolocator_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: geolocator_android
|
||||
sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4"
|
||||
sha256: "179c3cb66dfa674fc9ccbf2be872a02658724d1c067634e2c427cf6df7df901a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.1+1"
|
||||
version: "5.0.2"
|
||||
geolocator_apple:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -504,6 +600,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.13"
|
||||
geolocator_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: geolocator_linux
|
||||
sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.3"
|
||||
geolocator_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -536,6 +640,54 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.3"
|
||||
google_identity_services_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: google_identity_services_web
|
||||
sha256: "5d187c46dc59e02646e10fe82665fc3884a9b71bc1c90c2b8b749316d33ee454"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.3+1"
|
||||
google_sign_in:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: google_sign_in
|
||||
sha256: d0a2c3bcb06e607bb11e4daca48bd4b6120f0bbc4015ccebbe757d24ea60ed2a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.0"
|
||||
google_sign_in_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: google_sign_in_android
|
||||
sha256: d5e23c56a4b84b6427552f1cf3f98f716db3b1d1a647f16b96dbb5b93afa2805
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.2.1"
|
||||
google_sign_in_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: google_sign_in_ios
|
||||
sha256: "102005f498ce18442e7158f6791033bbc15ad2dcc0afa4cf4752e2722a516c96"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.9.0"
|
||||
google_sign_in_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: google_sign_in_platform_interface
|
||||
sha256: "5f6f79cf139c197261adb6ac024577518ae48fdff8e53205c5373b5f6430a8aa"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
google_sign_in_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: google_sign_in_web
|
||||
sha256: "460547beb4962b7623ac0fb8122d6b8268c951cf0b646dd150d60498430e4ded"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.4+4"
|
||||
graphs:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -544,6 +696,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
gsettings:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: gsettings
|
||||
sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.8"
|
||||
hashcodes:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -556,10 +716,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: http
|
||||
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
|
||||
sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
version: "1.5.0"
|
||||
http_multi_server:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -576,6 +736,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.2"
|
||||
image:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image
|
||||
sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.5.4"
|
||||
image_picker:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -644,10 +812,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: image_size_getter
|
||||
sha256: "9a299e3af2ebbcfd1baf21456c3c884037ff524316c97d8e56035ea8fdf35653"
|
||||
sha256: "7c26937e0ae341ca558b7556591fd0cc456fcc454583b7cb665d2f03e93e590f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
version: "2.4.1"
|
||||
intl:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -664,14 +832,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.5"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.2"
|
||||
json_annotation:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -732,34 +892,34 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: location
|
||||
sha256: c2c4304071ec860525d5c50d142410072f8620c1d9f74874811af2e804e1a9c8
|
||||
sha256: b080053c181c7d152c43dd576eec6436c40e25f326933051c330da563ddd5333
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.0"
|
||||
version: "8.0.1"
|
||||
location_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: location_platform_interface
|
||||
sha256: a3404ea6d74e89b121630be62ed8edcc7b39fd108bd19805d0ae55c397135dd7
|
||||
sha256: ca8700bb3f6b1e8b2afbd86bd78b2280d116c613ca7bfa1d4d7b64eba357d749
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.0"
|
||||
version: "6.0.1"
|
||||
location_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: location_web
|
||||
sha256: "744bdff53dc455a2dc9a34474c49cde364d4fbef2aee009f8b0b4b68570c27a1"
|
||||
sha256: b8e3add5efe0d65c5e692b7a135d80a4015c580d3ea646fa71973e97668dd868
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.0"
|
||||
version: "6.0.1"
|
||||
logger:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logger
|
||||
sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
|
||||
sha256: "55d6c23a6c15db14920e037fe7e0dc32e7cdaf3b64b4b25df2d541b5b6b81c0c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
version: "2.6.1"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -840,6 +1000,22 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
package_info_plus:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_info_plus
|
||||
sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.3.1"
|
||||
package_info_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_info_plus_platform_interface
|
||||
sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.1"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -976,14 +1152,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.8"
|
||||
polylabel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: polylabel
|
||||
sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
pool:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -996,10 +1164,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: posix
|
||||
sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62
|
||||
sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.2"
|
||||
version: "6.0.3"
|
||||
proj4dart:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1012,10 +1180,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: provider
|
||||
sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84"
|
||||
sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.5"
|
||||
version: "6.1.5+1"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1044,10 +1212,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_android
|
||||
sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac"
|
||||
sha256: "5bcf0772a761b04f8c6bf814721713de6f3e5d9d89caf8d3fe031b02a342379e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.10"
|
||||
version: "2.4.11"
|
||||
shared_preferences_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1217,26 +1385,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher
|
||||
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
|
||||
sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.1"
|
||||
version: "6.3.2"
|
||||
url_launcher_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79"
|
||||
sha256: "0aedad096a85b49df2e4725fa32118f9fa580f3b14af7a2d2221896a02cd5656"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.16"
|
||||
version: "6.3.17"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_ios
|
||||
sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb"
|
||||
sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.3"
|
||||
version: "6.3.4"
|
||||
url_launcher_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1249,10 +1417,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_macos
|
||||
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
|
||||
sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.2"
|
||||
version: "3.2.3"
|
||||
url_launcher_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1289,10 +1457,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics
|
||||
sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de"
|
||||
sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.18"
|
||||
version: "1.1.19"
|
||||
vector_graphics_codec:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1305,10 +1473,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_compiler
|
||||
sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad"
|
||||
sha256: ca81fdfaf62a5ab45d7296614aea108d2c7d0efca8393e96174bf4d51e6725b0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.16"
|
||||
version: "1.1.18"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1317,6 +1485,22 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
vibration:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: vibration
|
||||
sha256: "3b08a0579c2f9c18d5d78cb5c74f1005f731e02eeca6d72561a2e8059bf98ec3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
vibration_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vibration_platform_interface
|
||||
sha256: "6ffeee63547562a6fef53c05a41d4fdcae2c0595b83ef59a4813b0612cd2bc36"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.0.3"
|
||||
vm_service:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1329,10 +1513,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: watcher
|
||||
sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
|
||||
sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.1.2"
|
||||
web:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1345,10 +1529,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: web_socket
|
||||
sha256: bfe6f435f6ec49cb6c01da1e275ae4228719e59a6b067048c51e72d9d63bcc4b
|
||||
sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
version: "1.0.1"
|
||||
web_socket_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1357,6 +1541,22 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
win32:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32
|
||||
sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.13.0"
|
||||
win32_registry:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32_registry
|
||||
sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
wkt_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -54,6 +54,10 @@ dependencies:
|
|||
flutter_sound: ^9.8.4
|
||||
audioplayers: ^6.1.0
|
||||
path_provider: ^2.1.4
|
||||
vibration: ^2.0.0
|
||||
firebase_auth: ^6.0.1
|
||||
google_sign_in: ^6.1.6
|
||||
firebase_core: ^4.0.0
|
||||
# geocoding: ^3.0.0
|
||||
|
||||
dev_dependencies:
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
|
||||
#include <audioplayers_windows/audioplayers_windows_plugin.h>
|
||||
#include <file_selector_windows/file_selector_windows.h>
|
||||
#include <firebase_auth/firebase_auth_plugin_c_api.h>
|
||||
#include <firebase_core/firebase_core_plugin_c_api.h>
|
||||
#include <geolocator_windows/geolocator_windows.h>
|
||||
#include <maps_launcher/maps_launcher_plugin.h>
|
||||
#include <permission_handler_windows/permission_handler_windows_plugin.h>
|
||||
|
|
@ -18,6 +20,10 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
|
|||
registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin"));
|
||||
FileSelectorWindowsRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FileSelectorWindows"));
|
||||
FirebaseAuthPluginCApiRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi"));
|
||||
FirebaseCorePluginCApiRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FirebaseCorePluginCApi"));
|
||||
GeolocatorWindowsRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("GeolocatorWindows"));
|
||||
MapsLauncherPluginRegisterWithRegistrar(
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@
|
|||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
audioplayers_windows
|
||||
file_selector_windows
|
||||
firebase_auth
|
||||
firebase_core
|
||||
geolocator_windows
|
||||
maps_launcher
|
||||
permission_handler_windows
|
||||
|
|
|
|||
Loading…
Reference in New Issue