fix(ui): Fix some ui bugs

This commit is contained in:
anhtunz
2025-03-14 22:36:25 +07:00
parent c21667606a
commit ba9a3d95f6
10 changed files with 174 additions and 120 deletions

View File

@@ -28,6 +28,14 @@ apply plugin: 'com.google.gms.google-services'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android { android {
namespace "com.example.sfm_app" namespace "com.example.sfm_app"
compileSdkVersion 34 compileSdkVersion 34
@@ -47,6 +55,17 @@ android {
sourceSets { sourceSets {
main.java.srcDirs += 'src/main/kotlin' main.java.srcDirs += 'src/main/kotlin'
} }
subprojects {
afterEvaluate { project ->
if (project.plugins.hasPlugin("com.android.application") ||
project.plugins.hasPlugin("com.android.library")) {
project.android {
compileSdkVersion 34
buildToolsVersion "34.0.0"
}
}
}
}
defaultConfig { defaultConfig {
// START: Flutter Local Notifications // START: Flutter Local Notifications
@@ -61,7 +80,14 @@ android {
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
} }
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes { buildTypes {
release { release {
// TODO: Add your own signing config for the release build. // TODO: Add your own signing config for the release build.

View File

@@ -1,5 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:data_table_2/data_table_2.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'add_new_device_widget.dart'; import 'add_new_device_widget.dart';
@@ -85,112 +87,105 @@ class _DevicesManagerScreenState extends State<DevicesManagerScreen> {
stream: devicesManagerBloc.streamUserRole, stream: devicesManagerBloc.streamUserRole,
initialData: role, initialData: role,
builder: (context, roleSnapshot) { builder: (context, roleSnapshot) {
return CardTheme( return SizedBox(
color: Theme.of(context).colorScheme.onPrimary, height: context.dynamicHeight(0.4),
shadowColor: child: CardTheme(
Theme.of(context).colorScheme.onPrimary, color: Theme.of(context).colorScheme.onPrimary,
child: PaginatedDataTable( shadowColor:
headingRowHeight: 30, Theme.of(context).colorScheme.onPrimary,
columnSpacing: 30, child: PaginatedDataTable2(
horizontalMargin: 10, headingRowHeight: 30,
header: Center( columnSpacing: 30,
child: Text( horizontalMargin: 10,
appLocalization(context) fixedLeftColumns: 1,
.paginated_data_table_title, autoRowsToHeight: true,
style: context.headlineMediumTextStyle, renderEmptyRowsInTheEnd: false,
dragStartBehavior: DragStartBehavior.down,
minWidth: 950,
header: Center(
child: Text(
appLocalization(context)
.paginated_data_table_title,
style: context.headlineMediumTextStyle,
),
), ),
), columns: [
columns: [ if (roleSnapshot.data ==
if (roleSnapshot.data == RoleEnums.ADMIN.name ||
RoleEnums.ADMIN.name || roleSnapshot.data ==
roleSnapshot.data == RoleEnums.USER.name)
RoleEnums.USER.name) DataColumn(
DataColumn( label: Text(appLocalization(context)
label: Center(
child: Text(appLocalization(context)
.paginated_data_table_column_deviceName), .paginated_data_table_column_deviceName),
), ),
), DataColumn(
DataColumn( label: Text(appLocalization(context)
label: Center(
child: Text(appLocalization(context)
.paginated_data_table_column_deviceStatus), .paginated_data_table_column_deviceStatus),
), ),
), DataColumn(
DataColumn( label: Text(appLocalization(context)
label: Center(
child: Text(appLocalization(context)
.paginated_data_table_column_deviceBaterry), .paginated_data_table_column_deviceBaterry),
), ),
), DataColumn(
DataColumn( label: Text(appLocalization(context)
label: Center(
child: Text(appLocalization(context)
.paginated_data_table_column_deviceSignal), .paginated_data_table_column_deviceSignal),
), ),
), DataColumn(
DataColumn( label: Text(appLocalization(context)
label: Center(
child: Text(appLocalization(context)
.paginated_data_table_column_deviceTemperature), .paginated_data_table_column_deviceTemperature),
), ),
), DataColumn(
DataColumn( label: Text(appLocalization(context)
label: Center(
child: Text(appLocalization(context)
.paginated_data_table_column_deviceHump), .paginated_data_table_column_deviceHump),
), ),
), DataColumn(
DataColumn( label: Text(appLocalization(context)
label: Center(
child: Text(appLocalization(context)
.paginated_data_table_column_devicePower), .paginated_data_table_column_devicePower),
), ),
), DataColumn(
DataColumn( label: Text(appLocalization(context)
label: Center(
child: Text(appLocalization(context)
.paginated_data_table_column_action), .paginated_data_table_column_action),
), ),
), ],
], onPageChanged: (int pageIndex) {
onPageChanged: (int pageIndex) { // log('Chuyen page: $pageIndex');
// log('Chuyen page: $pageIndex'); },
}, // rowsPerPage:
rowsPerPage: // (allDeviceSnapshot.data?.length ?? 1) < 6
(allDeviceSnapshot.data?.length ?? 1) < 6 // ? (allDeviceSnapshot.data?.length ??
? (allDeviceSnapshot.data?.length ?? // 0)
0) // : 5,
: 5,
actions: [ actions: [
if (roleSnapshot.data == if (roleSnapshot.data ==
RoleEnums.USER.name || RoleEnums.USER.name ||
roleSnapshot.data == roleSnapshot.data ==
RoleEnums.ADMIN.name) RoleEnums.ADMIN.name)
IconButton( IconButton(
style: ButtonStyle( style: ButtonStyle(
backgroundColor: backgroundColor:
WidgetStateProperty.all<Color>( WidgetStateProperty.all<Color>(
Colors.green), Colors.green),
iconColor: iconColor:
WidgetStateProperty.all<Color>( WidgetStateProperty.all<Color>(
Colors.white, Colors.white,
),
), ),
), onPressed: () {
onPressed: () { ScaffoldMessenger.of(context)
ScaffoldMessenger.of(context) .clearSnackBars();
.clearSnackBars(); addNewDevice(context,
addNewDevice(context, roleSnapshot.data ?? role);
roleSnapshot.data ?? role); },
}, icon: IconConstants.instance
icon: IconConstants.instance .getMaterialIcon(Icons.add))
.getMaterialIcon(Icons.add)) ],
], source: DeviceSource(
source: DeviceSource( devices: allDeviceSnapshot.data ?? devices,
devices: allDeviceSnapshot.data ?? devices, context: context,
context: context, devicesBloc: devicesManagerBloc,
devicesBloc: devicesManagerBloc, role: role,
role: role, ),
), ),
), ),
); );

View File

@@ -9,6 +9,7 @@ import 'package:go_router/go_router.dart';
import 'package:badges/badges.dart' as badges; import 'package:badges/badges.dart' as badges;
import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart'; import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart';
import 'package:sfm_app/feature/sound_notification_test/notification_screen.dart'; import 'package:sfm_app/feature/sound_notification_test/notification_screen.dart';
import 'package:sfm_app/product/permission/notification_permission.dart';
import '../settings/profile/profile_model.dart'; import '../settings/profile/profile_model.dart';
import '../../product/extention/context_extention.dart'; import '../../product/extention/context_extention.dart';
import '../../bloc/home_bloc.dart'; import '../../bloc/home_bloc.dart';
@@ -72,6 +73,7 @@ class _MainScreenState extends State<MainScreen> with WidgetsBindingObserver {
mainBloc.sinkIsVNIcon.add(isVN); mainBloc.sinkIsVNIcon.add(isVN);
mainBloc.sinkThemeMode.add(isLight); mainBloc.sinkThemeMode.add(isLight);
LocationPermissionRequest.instance.checkLocationPermission(context); LocationPermissionRequest.instance.checkLocationPermission(context);
NotificationPermission.instance.checkNotificationPermission(context);
} }
@override @override
@@ -148,15 +150,15 @@ class _MainScreenState extends State<MainScreen> with WidgetsBindingObserver {
inactiveIcon: inactiveIcon:
IconConstants.instance.getMaterialIcon(Icons.group_outlined), IconConstants.instance.getMaterialIcon(Icons.group_outlined),
), ),
PersistentBottomNavBarItem( // PersistentBottomNavBarItem(
icon: IconConstants.instance // icon: IconConstants.instance
.getMaterialIcon(Icons.notifications_outlined), // .getMaterialIcon(Icons.notifications_outlined),
title: appLocalization(context).notification, // title: appLocalization(context).notification,
activeColorPrimary: Colors.blue, // activeColorPrimary: Colors.blue,
inactiveColorPrimary: Colors.grey, // inactiveColorPrimary: Colors.grey,
inactiveIcon: IconConstants.instance // inactiveIcon: IconConstants.instance
.getMaterialIcon(Icons.notifications_outlined), // .getMaterialIcon(Icons.notifications_outlined),
), // ),
]; ];
} }
@@ -181,10 +183,10 @@ class _MainScreenState extends State<MainScreen> with WidgetsBindingObserver {
child: const InterFamilyScreen(), child: const InterFamilyScreen(),
blocBuilder: () => InterFamilyBloc(), blocBuilder: () => InterFamilyBloc(),
), ),
BlocProvider( /*BlocProvider(
child: const NotificationScreen(), child: const NotificationScreen(),
blocBuilder: () => NotificationBloc(), blocBuilder: () => NotificationBloc(),
), ),*/
]; ];
} }
@@ -221,8 +223,8 @@ class _MainScreenState extends State<MainScreen> with WidgetsBindingObserver {
}, },
icon: Icon( icon: Icon(
themeModeSnapshot.data ?? isLight themeModeSnapshot.data ?? isLight
? Icons.dark_mode_outlined ? Icons.light_mode_outlined
: Icons.light_mode_outlined, : Icons.dark_mode_outlined,
), ),
), ),
StreamBuilder<bool>( StreamBuilder<bool>(

View File

@@ -106,7 +106,7 @@ class _MapScreenState extends State<MapScreen> with WidgetsBindingObserver {
onMapCreated: onMapCreated, onMapCreated: onMapCreated,
markers: markerSnapshot.data ?? markersAll markers: markerSnapshot.data ?? markersAll
..addAll(markers), ..addAll(markers),
zoomControlsEnabled: false, zoomControlsEnabled: true,
myLocationEnabled: true, myLocationEnabled: true,
mapToolbarEnabled: false, mapToolbarEnabled: false,
onCameraMove: (position) { onCameraMove: (position) {
@@ -138,10 +138,10 @@ class _MapScreenState extends State<MapScreen> with WidgetsBindingObserver {
void checkTheme() async { void checkTheme() async {
String theme = await apiServices.checkTheme(); String theme = await apiServices.checkTheme();
if (theme == AppThemes.LIGHT.name) { if (theme == AppThemes.DARK.name) {
themeMode = '';
} else {
themeMode = await _getFileData('assets/map_themes/maps_dark_theme.json'); themeMode = await _getFileData('assets/map_themes/maps_dark_theme.json');
} else {
themeMode = '';
} }
mapBloc.sinkMapTheme.add(themeMode); mapBloc.sinkMapTheme.add(themeMode);
} }
@@ -274,10 +274,16 @@ class _MapScreenState extends State<MapScreen> with WidgetsBindingObserver {
if (response != "") { if (response != "") {
final data = jsonDecode(response); final data = jsonDecode(response);
List<dynamic> result = data['items']; List<dynamic> result = data['items'];
final devicesList = Device.fromJsonDynamicList(result); if(result.isNotEmpty){
for (var device in devicesList) { devices.clear();
devices.add(device); final devicesList = Device.fromJsonDynamicList(result);
for (var device in devicesList) {
devices.add(device);
}
}else{
} }
} }
} }

View File

@@ -188,8 +188,7 @@ showNearPlacesSideSheet(
longitude, longitude,
); );
}, },
icon: IconConstants.instance icon: const Icon(Icons.turn_right,color: Colors.white),
.getMaterialIcon(Icons.turn_right),
label: Text(appLocalization(listViewContext) label: Text(appLocalization(listViewContext)
.map_show_direction), .map_show_direction),
), ),

View File

@@ -81,12 +81,12 @@
"event_tag_title": "Sự kiện", "event_tag_title": "Sự kiện",
"description_NOTUSE3": "This is vietnamese language in InterFamily", "description_NOTUSE3": "This is vietnamese language in InterFamily",
"interfamily_page_name": "Liên gia", "interfamily_page_name": "Liên gia",
"my_group_title": "Group của tôi", "my_group_title": "Nhóm của tôi",
"invite_group": "Group tham gia", "invite_group": "Nhóm tham gia",
"add_new_group": "Thêm nhóm mới", "add_new_group": "Thêm nhóm mới",
"join_group": "Tham gia nhóm", "join_group": "Tham gia nhóm",
"group_name_title": "Tên nhóm", "group_name_title": "Tên nhóm",
"group_id_title": "ID nhóm", "group_id_title": " nhóm",
"add_new_user_title": "Thêm người dùng", "add_new_user_title": "Thêm người dùng",
"share_group_title": "Chia sẻ nhóm", "share_group_title": "Chia sẻ nhóm",
"change_group_infomation_title": "Đổi thông tin", "change_group_infomation_title": "Đổi thông tin",

View File

@@ -3,9 +3,25 @@ import 'dart:developer';
import 'package:app_settings/app_settings.dart'; import 'package:app_settings/app_settings.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import '../base/widget/dialog/request_permission_dialog.dart'; import '../base/widget/dialog/request_permission_dialog.dart';
class NotificationPermission { class NotificationPermission {
NotificationPermission._init();
static NotificationPermission? _instance;
static NotificationPermission get instance =>
_instance ??= NotificationPermission._init();
Future<bool> checkNotificationPermission(context) async {
var status = await Permission.notification.status;
log("Status: $status");
if (status.isDenied || status.isPermanentlyDenied) {
requestNotificationsPermission(context);
return false;
} else {
return true;
}
}
FirebaseMessaging messaging = FirebaseMessaging.instance; FirebaseMessaging messaging = FirebaseMessaging.instance;
void requestNotificationsPermission(BuildContext context) async { void requestNotificationsPermission(BuildContext context) async {
NotificationSettings settings = await messaging.requestPermission( NotificationSettings settings = await messaging.requestPermission(

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart'; import 'package:flutter_barcode_scanner_plus/flutter_barcode_scanner_plus.dart';
import '../services/language_services.dart'; import '../services/language_services.dart';
class QRScanUtils { class QRScanUtils {

View File

@@ -97,6 +97,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.6" version: "1.0.6"
data_table_2:
dependency: "direct main"
description:
name: data_table_2
sha256: "5a540a7b64809eb46b3809c67fc6faa29ca217864341294df66b1f0eb040c20e"
url: "https://pub.dev"
source: hosted
version: "2.5.18"
dbus: dbus:
dependency: transitive dependency: transitive
description: description:
@@ -238,14 +246,14 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_barcode_scanner: flutter_barcode_scanner_plus:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_barcode_scanner name: flutter_barcode_scanner_plus
sha256: a4ba37daf9933f451a5e812c753ddd045d6354e4a3280342d895b07fecaab3fa sha256: "75bcf27d12ad6cd075dcfc8d838cffc254dab89cf9d33ec470faa1f9b4f97296"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.0" version: "3.0.8"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:

View File

@@ -52,7 +52,8 @@ dependencies:
google_maps_cluster_manager_2: ^3.2.0 google_maps_cluster_manager_2: ^3.2.0
dropdown_button2: ^2.3.9 dropdown_button2: ^2.3.9
maps_launcher: ^2.2.1 maps_launcher: ^2.2.1
flutter_barcode_scanner: ^2.0.0 # flutter_barcode_scanner: ^2.0.0
flutter_barcode_scanner_plus: ^3.0.8
search_choices: ^2.3.1 search_choices: ^2.3.1
dio: ^5.7.0 dio: ^5.7.0
rxdart: ^0.28.0 rxdart: ^0.28.0
@@ -65,6 +66,7 @@ dependencies:
persistent_bottom_nav_bar: ^6.2.1 persistent_bottom_nav_bar: ^6.2.1
win32: ^5.10.0 win32: ^5.10.0
google_maps_flutter: ^2.10.0 google_maps_flutter: ^2.10.0
data_table_2: ^2.5.18
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: