Appearance
Overview
- File:
lib/views/login_page.dart
The login_page.dart file implements the login screen of the HVC XR application. It provides two main authentication methods: QR code scanning and rapid connect functionality. The page is designed to work with RealWear devices and includes device-specific optimizations.
Class Structure
dart
class LoginPage extends StatelessWidget {
static const String routeName = '/LoginPage';
const LoginPage({Key? key}) : super(key: key);
// ...
}Dependencies
dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:hvc_xr/hlk_helpers/hlk_utils.dart';
import 'package:hvc_xr/hlk_helpers/hlk_widgets.dart';
import 'package:hvc_xr/shared/common.dart';
import 'package:hvc_xr/shared/constants.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';Key Components
Controllers
The page uses several GetX controllers:
dart
final DigilensController digilensController = Get.find();
final RealTimeController realTimeController = Get.find();
final MeetingsController meetingsController = Get.find();State Management
- Uses GetX for state management
- Implements reactive state with
RxBool loading - Stores user data using
GetStorage
UI Components
Background
dart
PageWithBackground(
assetImagePath: 'assets/images/hvc_xr_bg.jpeg',
child: Scaffold(
backgroundColor: Colors.transparent,
// ...
),
)Main Layout
The page consists of:
- Logo Banner
- Scan Code Button
- Rapid Connect Button
- Version Information
Buttons
Scan Code Button
dart
ElevatedButton(
style: ElevatedButton.styleFrom(primary: kAppColorPink),
onPressed: () => SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]).then((value) async => await validatePermission(
Permission.camera,
() => Get.toNamed(isNavigator500
? ScannerPage.routeName
: NewScannerPage.routeName))),
child: const Padding(
padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 80),
child: Text('SCAN CODE'),
),
)Rapid Connect Button
dart
Obx(() => ElevatedButton(
style: ElevatedButton.styleFrom(primary: kAppColorPink),
onPressed: () async {
// Rapid connect logic
},
child: loading.value
? LoadingSpinner()
: Text('RAPID CONNECT'),
))Authentication Flow
QR Code Scanning
- Validates camera permission
- Sets device orientation
- Routes to appropriate scanner page based on device type:
ScannerPagefor Navigator 500NewScannerPagefor other devices
Rapid Connect
- Retrieves last used domain
- Validates organization list
- Initiates rapid connection
- Stores user data
- Initializes real-time controller
- Routes to
RapidConnectPage
dart
var orgList = getLastDomain();
if (orgList.isEmpty) {
HlkDialog.showErrorSnackBar(
'No Organization found, you will need to login at least once for this to be possible');
} else if (orgList.length == 1) {
// Rapid connect implementation
}Data Storage
User data is stored using GetStorage:
dart
await storage.write(Constants.ORGANISATION, org);
await storage.write(Constants.USER_DATA, {
"userId": rapidConn.uniqueId,
"id": int.tryParse(rapidConn.joinCode) ?? 0,
"tosAccepted": true,
"name": rapidConn.displayName,
// ... other user data
});Error Handling
- Displays error messages using
HlkDialog.showErrorSnackBar - Implements try-catch blocks for async operations
- Handles empty organization lists
- Manages loading states
Device-Specific Features
- Adapts scanner page based on device type
- Handles device orientation
- Manages permissions appropriately
Dependencies
flutter_screenutil: Screen utilitiesget: State managementget_storage: Local storagepermission_handler: Permission managementflutter_spinkit: Loading indicators
Styling
- Uses
kAppColorPinkfor button colors - Implements consistent padding and spacing
- Uses
whiteTextStylefor version text - Maintains responsive design with
ScreenUtil