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 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 {
namespace "com.example.sfm_app"
compileSdkVersion 34
@@ -47,6 +55,17 @@ android {
sourceSets {
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 {
// START: Flutter Local Notifications
@@ -61,7 +80,14 @@ android {
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.

View File

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

View File

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

View File

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

View File

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

View File

@@ -81,12 +81,12 @@
"event_tag_title": "Sự kiện",
"description_NOTUSE3": "This is vietnamese language in InterFamily",
"interfamily_page_name": "Liên gia",
"my_group_title": "Group của tôi",
"invite_group": "Group tham gia",
"my_group_title": "Nhóm của tôi",
"invite_group": "Nhóm tham gia",
"add_new_group": "Thêm nhóm mới",
"join_group": "Tham gia 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",
"share_group_title": "Chia sẻ nhóm",
"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:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import '../base/widget/dialog/request_permission_dialog.dart';
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;
void requestNotificationsPermission(BuildContext context) async {
NotificationSettings settings = await messaging.requestPermission(

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.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';
class QRScanUtils {

View File

@@ -97,6 +97,14 @@ packages:
url: "https://pub.dev"
source: hosted
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:
dependency: transitive
description:
@@ -238,14 +246,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_barcode_scanner:
flutter_barcode_scanner_plus:
dependency: "direct main"
description:
name: flutter_barcode_scanner
sha256: a4ba37daf9933f451a5e812c753ddd045d6354e4a3280342d895b07fecaab3fa
name: flutter_barcode_scanner_plus
sha256: "75bcf27d12ad6cd075dcfc8d838cffc254dab89cf9d33ec470faa1f9b4f97296"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
version: "3.0.8"
flutter_lints:
dependency: "direct dev"
description:

View File

@@ -52,7 +52,8 @@ dependencies:
google_maps_cluster_manager_2: ^3.2.0
dropdown_button2: ^2.3.9
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
dio: ^5.7.0
rxdart: ^0.28.0
@@ -65,6 +66,7 @@ dependencies:
persistent_bottom_nav_bar: ^6.2.1
win32: ^5.10.0
google_maps_flutter: ^2.10.0
data_table_2: ^2.5.18
dev_dependencies:
flutter_test: