update(MainScreen): Fix Timer cannot cancel when switching tabs
This commit is contained in:
@@ -1,10 +1,17 @@
|
||||
import 'dart:async';
|
||||
|
||||
import '../feature/home/device_alias_model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sfm_app/product/extension/context_extension.dart';
|
||||
|
||||
import '../product/services/api_services.dart';
|
||||
import '../feature/home/device_alias_model.dart';
|
||||
import '../product/base/bloc/base_bloc.dart';
|
||||
import '../product/services/language_services.dart';
|
||||
import '../product/utils/device_utils.dart';
|
||||
|
||||
class HomeBloc extends BlocBase {
|
||||
APIServices apiServices = APIServices();
|
||||
|
||||
final allDevicesAliasMap =
|
||||
StreamController<Map<String, List<DeviceWithAlias>>>.broadcast();
|
||||
StreamSink<Map<String, List<DeviceWithAlias>>> get sinkAllDevicesAliasMap =>
|
||||
@@ -12,12 +19,12 @@ class HomeBloc extends BlocBase {
|
||||
Stream<Map<String, List<DeviceWithAlias>>> get streamAllDevicesAliasMap =>
|
||||
allDevicesAliasMap.stream;
|
||||
|
||||
final allDevicesAliasJoinedMap =
|
||||
StreamController<Map<String, List<DeviceWithAlias>>>.broadcast();
|
||||
StreamSink<Map<String, List<DeviceWithAlias>>>
|
||||
get sinkAllDevicesAliasJoinedMap => allDevicesAliasJoinedMap.sink;
|
||||
Stream<Map<String, List<DeviceWithAlias>>>
|
||||
get streamAllDevicesAliasJoinedMap => allDevicesAliasJoinedMap.stream;
|
||||
// final allDevicesAliasJoinedMap =
|
||||
// StreamController<Map<String, List<DeviceWithAlias>>>.broadcast();
|
||||
// StreamSink<Map<String, List<DeviceWithAlias>>>
|
||||
// get sinkAllDevicesAliasJoinedMap => allDevicesAliasJoinedMap.sink;
|
||||
// Stream<Map<String, List<DeviceWithAlias>>>
|
||||
// get streamAllDevicesAliasJoinedMap => allDevicesAliasJoinedMap.stream;
|
||||
|
||||
final countNotification = StreamController<int>.broadcast();
|
||||
StreamSink<int> get sinkCountNotification => countNotification.sink;
|
||||
@@ -34,12 +41,104 @@ class HomeBloc extends BlocBase {
|
||||
Stream<Map<String, List<DeviceWithAlias>>> get streamOwnerDevicesStatus =>
|
||||
ownerDevicesStatus.stream;
|
||||
|
||||
|
||||
final aliasDevices = StreamController<List<DeviceWithAlias>?>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>?> get sinkAliasDevices => aliasDevices.sink;
|
||||
Stream<List<DeviceWithAlias>?> get streamAliasDevices => aliasDevices.stream;
|
||||
|
||||
void getOwnerAndJoinedDevices(BuildContext context) async {
|
||||
|
||||
await apiServices.execute(context, () async {
|
||||
List<DeviceWithAlias> devices = await apiServices.getDashBoardDevices().handleApiError();
|
||||
List<DeviceWithAlias> publicDevices = [];
|
||||
for (var device in devices) {
|
||||
if (device.visibility == "PUBLIC") {
|
||||
publicDevices.add(device);
|
||||
}
|
||||
}
|
||||
sinkAliasDevices.add(publicDevices);
|
||||
if (!context.mounted) return;
|
||||
getOwnerDeviceState(context, publicDevices);
|
||||
});
|
||||
}
|
||||
void getOwnerDeviceState(BuildContext context,List<DeviceWithAlias> allDevices) async {
|
||||
// int notificationCount = 0;
|
||||
Map<String, List<DeviceWithAlias>> ownerDevicesStatus = {};
|
||||
List<String> ownerDevicesState = [];
|
||||
|
||||
if (!context.mounted) return;
|
||||
sinkOwnerDevicesStatus.add(ownerDevicesStatus);
|
||||
|
||||
int count = 0;
|
||||
for (var device in allDevices) {
|
||||
// if (device.isOwner != true) continue;
|
||||
|
||||
if (!context.mounted) return;
|
||||
Map<String, dynamic> sensorMap = DeviceUtils.instance
|
||||
.getDeviceSensors(context, device.status?.sensors ?? []);
|
||||
|
||||
if (device.state == 1 || device.state == 3) {
|
||||
ownerDevicesStatus["state"] ??= [];
|
||||
ownerDevicesStatus["state"]!.add(device);
|
||||
if (!context.mounted) return;
|
||||
sinkOwnerDevicesStatus.add(ownerDevicesStatus);
|
||||
count++;
|
||||
}
|
||||
|
||||
final noDataMessage = appLocalization(context).no_data_message;
|
||||
if (sensorMap['sensorBattery'] != noDataMessage) {
|
||||
if (double.parse(sensorMap['sensorBattery']) <= 20) {
|
||||
ownerDevicesStatus['battery'] ??= [];
|
||||
ownerDevicesStatus['battery']!.add(device);
|
||||
if (!context.mounted) return;
|
||||
sinkOwnerDevicesStatus.add(ownerDevicesStatus);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!context.mounted) return;
|
||||
sinkCountNotification.add(count);
|
||||
}
|
||||
|
||||
void getDeviceStatusAliasMap(List<DeviceWithAlias> devices) {
|
||||
Map<String, List<DeviceWithAlias>> allDevicesAliasMap = {};
|
||||
for (var key in ['all', 'online', 'offline', 'warning', 'not-use']) {
|
||||
allDevicesAliasMap[key] = [];
|
||||
}
|
||||
|
||||
for (DeviceWithAlias device in devices) {
|
||||
allDevicesAliasMap['all']!.add(device);
|
||||
if (device.state == 0 || device.state == 1) {
|
||||
allDevicesAliasMap['online']!.add(device);
|
||||
}
|
||||
if (device.state == -1) {
|
||||
allDevicesAliasMap['offline']!.add(device);
|
||||
}
|
||||
if (device.state == 1) {
|
||||
allDevicesAliasMap['warning']!.add(device);
|
||||
}
|
||||
if (device.state == -2) {
|
||||
allDevicesAliasMap['not-use']!.add(device);
|
||||
}
|
||||
|
||||
}
|
||||
sinkAllDevicesAliasMap.add(allDevicesAliasMap);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
allDevicesAliasMap.close();
|
||||
allDevicesAliasJoinedMap.close();
|
||||
// allDevicesAliasJoinedMap.close();
|
||||
countNotification.close();
|
||||
hasJoinedDevice.close();
|
||||
ownerDevicesStatus.close();
|
||||
aliasDevices.close();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart';
|
||||
|
||||
import '../../product/shared/shared_loading_animation.dart';
|
||||
import '../../product/shared/shared_component_loading_animation.dart';
|
||||
import '../../product/utils/app_logger_utils.dart';
|
||||
import 'shared/alert_card.dart';
|
||||
import 'shared/warning_card.dart';
|
||||
import '../../product/utils/device_utils.dart';
|
||||
import 'device_alias_model.dart';
|
||||
import 'shared/overview_card.dart';
|
||||
import '../settings/device_notification_settings/device_notification_settings_model.dart';
|
||||
@@ -18,8 +16,7 @@ import '../../bloc/home_bloc.dart';
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
|
||||
class HomeScreen extends StatefulWidget {
|
||||
const HomeScreen({super.key, required this.persistentTabController});
|
||||
final PersistentTabController persistentTabController;
|
||||
const HomeScreen({super.key});
|
||||
@override
|
||||
State<HomeScreen> createState() => _HomeScreenState();
|
||||
}
|
||||
@@ -27,24 +24,17 @@ class HomeScreen extends StatefulWidget {
|
||||
class _HomeScreenState extends State<HomeScreen> {
|
||||
late HomeBloc homeBloc;
|
||||
APIServices apiServices = APIServices();
|
||||
Map<String, List<DeviceWithAlias>> allDevicesAliasMap = {};
|
||||
List<DeviceWithAlias> devices = [];
|
||||
bool isFunctionCall = false;
|
||||
Timer? getAllDevicesTimer;
|
||||
int notificationCount = 0;
|
||||
Map<String, List<DeviceWithAlias>> ownerDevicesStatus = {};
|
||||
List<String> ownerDevicesState = [];
|
||||
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
homeBloc = BlocProvider.of(context);
|
||||
getAllDevicesTimer?.cancel();
|
||||
AppLoggerUtils.debug("Init State HomeScreen");
|
||||
getOwnerAndJoinedDevices();
|
||||
const duration = Duration(seconds: 10);
|
||||
getAllDevicesTimer =
|
||||
Timer.periodic(duration, (Timer t) => getOwnerAndJoinedDevices());
|
||||
Timer.periodic(duration, (Timer t) => homeBloc.getOwnerAndJoinedDevices(context));
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -56,6 +46,17 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return StreamBuilder<List<DeviceWithAlias>?>(
|
||||
stream: homeBloc.streamAliasDevices,
|
||||
builder: (context, aliasDevicesSnapshot) {
|
||||
if(aliasDevicesSnapshot.data == null){
|
||||
homeBloc.getOwnerAndJoinedDevices(context);
|
||||
return const SharedLoadingAnimation();
|
||||
}else{
|
||||
log("Goi else");
|
||||
homeBloc.getOwnerDeviceState(context, aliasDevicesSnapshot.data ?? []);
|
||||
homeBloc.getDeviceStatusAliasMap(aliasDevicesSnapshot.data ?? []);
|
||||
checkSettingDevice(aliasDevicesSnapshot.data ?? []);
|
||||
return Scaffold(
|
||||
body: Padding(
|
||||
padding: context.paddingLow,
|
||||
@@ -72,10 +73,15 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
StreamBuilder<int>(
|
||||
stream: homeBloc.streamCountNotification,
|
||||
builder: (context, countSnapshot) {
|
||||
if(countSnapshot.data == null){
|
||||
homeBloc.getOwnerDeviceState(context, aliasDevicesSnapshot.data ?? []);
|
||||
return const Text("0");
|
||||
} else{
|
||||
return Text(
|
||||
"(${countSnapshot.data ?? 0})",
|
||||
style: context.titleMediumTextStyle,
|
||||
);
|
||||
}
|
||||
},
|
||||
)
|
||||
],
|
||||
@@ -85,7 +91,11 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
scrollDirection: Axis.horizontal,
|
||||
child: StreamBuilder<Map<String, List<DeviceWithAlias>>>(
|
||||
stream: homeBloc.streamOwnerDevicesStatus,
|
||||
builder: (context, snapshot) {
|
||||
builder: (context, ownerDevicesStatusSnapshot) {
|
||||
if(ownerDevicesStatusSnapshot.data == null){
|
||||
homeBloc.getOwnerDeviceState(context, aliasDevicesSnapshot.data ?? []);
|
||||
return const SharedComponentLoadingAnimation();
|
||||
}else{
|
||||
return AnimatedSwitcher(
|
||||
duration: context.lowDuration,
|
||||
transitionBuilder:
|
||||
@@ -105,8 +115,8 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
),
|
||||
);
|
||||
},
|
||||
child: snapshot.data?['state'] != null ||
|
||||
snapshot.data?['battery'] != null
|
||||
child: ownerDevicesStatusSnapshot.data?['state'] != null ||
|
||||
ownerDevicesStatusSnapshot.data?['battery'] != null
|
||||
? ConstrainedBox(
|
||||
key: const ValueKey('data'),
|
||||
constraints: BoxConstraints(
|
||||
@@ -115,8 +125,8 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
if (snapshot.data?['state'] != null)
|
||||
...snapshot.data!['state']!
|
||||
if (ownerDevicesStatusSnapshot.data?['state'] != null)
|
||||
...ownerDevicesStatusSnapshot.data!['state']!
|
||||
.map(
|
||||
(item) => SizedBox(
|
||||
width: context.dynamicWidth(0.95),
|
||||
@@ -138,8 +148,8 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
if (snapshot.data?['battery'] != null)
|
||||
...snapshot.data!['battery']!
|
||||
if (ownerDevicesStatusSnapshot.data?['battery'] != null)
|
||||
...ownerDevicesStatusSnapshot.data!['battery']!
|
||||
.map(
|
||||
(batteryItem) => SizedBox(
|
||||
width: context.dynamicWidth(0.95),
|
||||
@@ -195,6 +205,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
@@ -203,6 +214,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
stream: homeBloc.streamAllDevicesAliasMap,
|
||||
builder: (context, allDevicesAliasMapSnapshot) {
|
||||
if(allDevicesAliasMapSnapshot.data == null){
|
||||
homeBloc.getDeviceStatusAliasMap(aliasDevicesSnapshot.data ?? []);
|
||||
return const SharedComponentLoadingAnimation();
|
||||
}else{
|
||||
final data = allDevicesAliasMapSnapshot.data!;
|
||||
@@ -224,85 +236,8 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void getOwnerAndJoinedDevices() async {
|
||||
await apiServices.execute(context, () async {
|
||||
devices = await apiServices.getDashBoardDevices().handleApiError();
|
||||
List<DeviceWithAlias> publicDevices = [];
|
||||
for (var device in devices) {
|
||||
if (device.visibility == "PUBLIC") {
|
||||
publicDevices.add(device);
|
||||
}
|
||||
}
|
||||
getOwnerDeviceState(publicDevices);
|
||||
checkSettingDevice(publicDevices);
|
||||
getDeviceStatusAliasMap(publicDevices);
|
||||
});
|
||||
}
|
||||
|
||||
void getOwnerDeviceState(List<DeviceWithAlias> allDevices) async {
|
||||
ownerDevicesState.clear();
|
||||
ownerDevicesStatus.clear();
|
||||
|
||||
if (!mounted) return;
|
||||
homeBloc.sinkOwnerDevicesStatus.add(ownerDevicesStatus);
|
||||
|
||||
int count = 0;
|
||||
for (var device in allDevices) {
|
||||
// if (device.isOwner != true) continue;
|
||||
|
||||
if (!mounted) return;
|
||||
Map<String, dynamic> sensorMap = DeviceUtils.instance
|
||||
.getDeviceSensors(context, device.status?.sensors ?? []);
|
||||
|
||||
if (device.state == 1 || device.state == 3) {
|
||||
ownerDevicesStatus["state"] ??= [];
|
||||
ownerDevicesStatus["state"]!.add(device);
|
||||
if (!mounted) return;
|
||||
homeBloc.sinkOwnerDevicesStatus.add(ownerDevicesStatus);
|
||||
count++;
|
||||
}
|
||||
|
||||
final noDataMessage = appLocalization(context).no_data_message;
|
||||
if (sensorMap['sensorBattery'] != noDataMessage) {
|
||||
if (double.parse(sensorMap['sensorBattery']) <= 20) {
|
||||
ownerDevicesStatus['battery'] ??= [];
|
||||
ownerDevicesStatus['battery']!.add(device);
|
||||
if (!mounted) return;
|
||||
homeBloc.sinkOwnerDevicesStatus.add(ownerDevicesStatus);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
notificationCount = count;
|
||||
if (!mounted) return;
|
||||
homeBloc.sinkCountNotification.add(notificationCount);
|
||||
}
|
||||
|
||||
void getDeviceStatusAliasMap(List<DeviceWithAlias> devices) {
|
||||
allDevicesAliasMap.clear();
|
||||
for (var key in ['all', 'online', 'offline', 'warning', 'not-use']) {
|
||||
allDevicesAliasMap[key] = [];
|
||||
}
|
||||
|
||||
for (DeviceWithAlias device in devices) {
|
||||
allDevicesAliasMap['all']!.add(device);
|
||||
if (device.state == 0 || device.state == 1) {
|
||||
allDevicesAliasMap['online']!.add(device);
|
||||
}
|
||||
if (device.state == -1) {
|
||||
allDevicesAliasMap['offline']!.add(device);
|
||||
}
|
||||
if (device.state == 1) {
|
||||
allDevicesAliasMap['warning']!.add(device);
|
||||
}
|
||||
if (device.state == -2) {
|
||||
allDevicesAliasMap['not-use']!.add(device);
|
||||
}
|
||||
|
||||
}
|
||||
homeBloc.sinkAllDevicesAliasMap.add(allDevicesAliasMap);
|
||||
);
|
||||
}
|
||||
|
||||
void checkSettingDevice(List<DeviceWithAlias> devices) async {
|
||||
|
||||
@@ -7,7 +7,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||
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:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
||||
|
||||
import '../../product/utils/permission_handler.dart';
|
||||
import '../../product/permission/notification_permission.dart';
|
||||
@@ -147,79 +147,75 @@ class _MainScreenState extends State<MainScreen> with WidgetsBindingObserver {
|
||||
WidgetsBinding.instance.removeObserver(this);
|
||||
}
|
||||
|
||||
List<PersistentBottomNavBarItem> _navBarsItems() {
|
||||
return [
|
||||
PersistentBottomNavBarItem(
|
||||
icon: IconConstants.instance.getMaterialIcon(Icons.home),
|
||||
title: appLocalization(context).home_page_destination,
|
||||
activeColorPrimary: Colors.blue,
|
||||
inactiveColorPrimary: Colors.grey,
|
||||
inactiveIcon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.home_outlined),
|
||||
),
|
||||
PersistentBottomNavBarItem(
|
||||
icon: IconConstants.instance.getMaterialIcon(Icons.settings),
|
||||
title: appLocalization(context).manager_page_destination,
|
||||
activeColorPrimary: Colors.blue,
|
||||
inactiveColorPrimary: Colors.grey,
|
||||
inactiveIcon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.settings_outlined),
|
||||
),
|
||||
PersistentBottomNavBarItem(
|
||||
icon: IconConstants.instance.getMaterialIcon(Icons.location_on),
|
||||
title: appLocalization(context).map_page_destination,
|
||||
activeColorPrimary: Colors.blue,
|
||||
inactiveColorPrimary: Colors.grey,
|
||||
inactiveIcon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.location_on_outlined),
|
||||
),
|
||||
PersistentBottomNavBarItem(
|
||||
icon: IconConstants.instance.getMaterialIcon(Icons.history),
|
||||
title: appLocalization(context).history_page_destination,
|
||||
activeColorPrimary: Colors.blue,
|
||||
inactiveColorPrimary: Colors.grey,
|
||||
inactiveIcon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.history_outlined),
|
||||
),
|
||||
PersistentBottomNavBarItem(
|
||||
icon: IconConstants.instance.getMaterialIcon(Icons.group),
|
||||
title: appLocalization(context).group_page_destination,
|
||||
activeColorPrimary: Colors.blue,
|
||||
inactiveColorPrimary: Colors.grey,
|
||||
inactiveIcon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.group_outlined),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
List<Widget> _buildScreens() {
|
||||
return [
|
||||
BlocProvider(
|
||||
child: HomeScreen(
|
||||
persistentTabController: controller,
|
||||
),
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
List<PersistentTabConfig> tabs = [
|
||||
PersistentTabConfig(
|
||||
screen: BlocProvider(
|
||||
child: const HomeScreen(),
|
||||
blocBuilder: () => HomeBloc(),
|
||||
),
|
||||
BlocProvider(
|
||||
item: ItemConfig(
|
||||
icon: IconConstants.instance.getMaterialIcon(Icons.home),
|
||||
title: appLocalization(context).home_page_destination,
|
||||
inactiveIcon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.home_outlined),
|
||||
iconSize: 30,
|
||||
),
|
||||
),
|
||||
PersistentTabConfig(
|
||||
screen: BlocProvider(
|
||||
child: const DevicesManagerScreen(),
|
||||
blocBuilder: () => DevicesManagerBloc()),
|
||||
BlocProvider(
|
||||
blocBuilder: () => DevicesManagerBloc(),
|
||||
),
|
||||
item: ItemConfig(
|
||||
icon: IconConstants.instance.getMaterialIcon(Icons.settings),
|
||||
title: appLocalization(context).manager_page_destination,
|
||||
inactiveIcon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.settings_outlined),
|
||||
iconSize: 30,
|
||||
),
|
||||
),
|
||||
PersistentTabConfig(
|
||||
screen: BlocProvider(
|
||||
child: const MapScreen(),
|
||||
blocBuilder: () => MapBloc(),
|
||||
),
|
||||
BlocProvider(
|
||||
item: ItemConfig(
|
||||
icon: IconConstants.instance.getMaterialIcon(Icons.location_on),
|
||||
title: appLocalization(context).map_page_destination,
|
||||
inactiveIcon: IconConstants.instance
|
||||
.getMaterialIcon(Icons.location_on_outlined),
|
||||
iconSize: 30,
|
||||
),
|
||||
),
|
||||
PersistentTabConfig(
|
||||
screen: BlocProvider(
|
||||
child: const DeviceLogsScreen(),
|
||||
blocBuilder: () => DeviceLogsBloc(),
|
||||
),
|
||||
BlocProvider(
|
||||
item: ItemConfig(
|
||||
icon: IconConstants.instance.getMaterialIcon(Icons.history),
|
||||
title: appLocalization(context).history_page_destination,
|
||||
inactiveIcon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.history_outlined),
|
||||
iconSize: 30,
|
||||
),
|
||||
),
|
||||
PersistentTabConfig(
|
||||
screen: BlocProvider(
|
||||
child: const InterFamilyScreen(),
|
||||
blocBuilder: () => InterFamilyBloc(),
|
||||
),
|
||||
item: ItemConfig(
|
||||
icon: IconConstants.instance.getMaterialIcon(Icons.group),
|
||||
title: appLocalization(context).group_page_destination,
|
||||
inactiveIcon:
|
||||
IconConstants.instance.getMaterialIcon(Icons.group_outlined),
|
||||
iconSize: 30,
|
||||
),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return StreamBuilder<bool>(
|
||||
stream: mainBloc.streamThemeMode,
|
||||
initialData: isLight,
|
||||
@@ -368,33 +364,28 @@ class _MainScreenState extends State<MainScreen> with WidgetsBindingObserver {
|
||||
],
|
||||
),
|
||||
body: PersistentTabView(
|
||||
context,
|
||||
controller: controller,
|
||||
screens: _buildScreens(),
|
||||
items: _navBarsItems(),
|
||||
handleAndroidBackButtonPress: true,
|
||||
resizeToAvoidBottomInset: true,
|
||||
stateManagement: false,
|
||||
controller: controller,
|
||||
tabs: tabs,
|
||||
navBarBuilder: (navBarConfig) => Style6BottomNavBar(
|
||||
navBarConfig: navBarConfig,
|
||||
navBarDecoration: NavBarDecoration(
|
||||
color: themeModeSnapshot.data! ? Colors.white : Colors.black,
|
||||
borderRadius: BorderRadius.circular(context.mediumValue),
|
||||
padding: const EdgeInsets.all(10)),
|
||||
),
|
||||
backgroundColor:
|
||||
themeModeSnapshot.data! ? Colors.white : Colors.black,
|
||||
decoration: NavBarDecoration(
|
||||
borderRadius: BorderRadius.circular(30.0),
|
||||
colorBehindNavBar:
|
||||
themeModeSnapshot.data! ? Colors.white : Colors.black,
|
||||
),
|
||||
animationSettings: const NavBarAnimationSettings(
|
||||
navBarItemAnimation: ItemAnimationSettings(
|
||||
duration: Duration(milliseconds: 200),
|
||||
curve: Curves.bounceInOut,
|
||||
),
|
||||
screenTransitionAnimation: ScreenTransitionAnimationSettings(
|
||||
animateTabTransition: true,
|
||||
navBarOverlap: const NavBarOverlap.none(),
|
||||
// margin: EdgeInsets.only(
|
||||
// left: context.lowValue,
|
||||
// bottom: context.dynamicHeight(0.02),
|
||||
// right: context.lowValue),
|
||||
screenTransitionAnimation: const ScreenTransitionAnimation(
|
||||
curve: Curves.bounceInOut,
|
||||
duration: Duration(milliseconds: 200),
|
||||
),
|
||||
),
|
||||
navBarStyle: NavBarStyle.style13,
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
@@ -25,5 +25,5 @@ class ApplicationConstants {
|
||||
static const PARTICIPANT_GROUP = "participant";
|
||||
static const NO_DATA = "no_data";
|
||||
static const LOADING = "loading";
|
||||
static int CALL_API_TIMEOUT = 15;
|
||||
static int CALL_API_TIMEOUT = 30;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ import 'dart:math' as math;
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||
import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart';
|
||||
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
||||
|
||||
class NotificationServices {
|
||||
FirebaseMessaging messaging = FirebaseMessaging.instance;
|
||||
@@ -30,11 +30,7 @@ class NotificationServices {
|
||||
void firebaseInit(BuildContext context) {
|
||||
FirebaseMessaging.onMessage.listen((message) {
|
||||
dev.log("Foreground message payload: ${message.toMap()}");
|
||||
if (WidgetsBinding.instance != null) {
|
||||
showNotification(message);
|
||||
} else {
|
||||
dev.log("App is in background, skipping foreground notification");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
12
pubspec.lock
12
pubspec.lock
@@ -417,10 +417,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: go_router
|
||||
sha256: b465e99ce64ba75e61c8c0ce3d87b66d8ac07f0b35d0a7e0263fcfc10f99e836
|
||||
sha256: "02ff498f6279470ff7f60c998a69b872f26696ceec237c8402e63a2133868ddf"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "13.2.5"
|
||||
version: "15.2.3"
|
||||
google_maps:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -693,14 +693,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.1"
|
||||
persistent_bottom_nav_bar:
|
||||
persistent_bottom_nav_bar_v2:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: persistent_bottom_nav_bar
|
||||
sha256: "6aa9b97ced1abd92c90cedd1997d34ea0b35c3ded762ac6063baccc299b0c4c5"
|
||||
name: persistent_bottom_nav_bar_v2
|
||||
sha256: "1d6347d86512ef028341eaecf2e8870af5dd41462fe77ec5b3126da29b4d7a8d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.2.1"
|
||||
version: "6.1.0"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
@@ -22,7 +22,7 @@ dependencies:
|
||||
permission_handler: ^11.0.1
|
||||
# flex_color_scheme: ^7.2.0
|
||||
flex_color_scheme: ^8.2.0
|
||||
go_router: ^13.1.0
|
||||
go_router: ^15.2.3
|
||||
http: ^1.3.0
|
||||
top_snackbar_flutter: ^3.1.0
|
||||
badges: ^3.1.2
|
||||
@@ -40,8 +40,7 @@ dependencies:
|
||||
flutter_polyline_points: ^2.1.0
|
||||
simple_ripple_animation: ^0.1.0
|
||||
fl_chart: ^0.64.0
|
||||
# persistent_bottom_nav_bar_v2: ^4.2.8
|
||||
persistent_bottom_nav_bar: ^6.2.1
|
||||
persistent_bottom_nav_bar_v2: ^6.1.0
|
||||
win32: ^5.10.0
|
||||
google_maps_flutter: ^2.12.2
|
||||
data_table_2: ^2.5.18
|
||||
|
||||
Reference in New Issue
Block a user