smartfarming-mobile/agrilink_vocpro/lib/features/control/view/control_screen.dart

155 lines
5.4 KiB
Dart
Raw Normal View History

2024-10-01 03:49:55 +00:00
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
2024-10-02 13:07:28 +00:00
import 'package:agrilink_vocpro/core/state/result_state.dart';
2024-10-01 03:49:55 +00:00
import 'package:agrilink_vocpro/features/control/provider/control_provider.dart';
2024-10-09 04:45:19 +00:00
import 'package:agrilink_vocpro/features/control/widgets/control_button_widget.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/cupertino.dart';
2024-10-01 03:49:55 +00:00
import 'package:flutter/material.dart';
2024-10-01 07:44:18 +00:00
import 'package:flutter_screenutil/flutter_screenutil.dart';
2024-10-01 03:49:55 +00:00
import 'package:provider/provider.dart';
class ControlScreen extends StatelessWidget {
const ControlScreen({super.key});
@override
Widget build(BuildContext context) {
final provider = Provider.of<ControlProvider>(context, listen: true);
2024-10-01 03:49:55 +00:00
return Scaffold(
appBar: AppBar(
2024-11-06 01:54:08 +00:00
title: Text('Kontrol', style: AppTheme.labelMedium),
2024-10-01 03:49:55 +00:00
centerTitle: true,
backgroundColor: Colors.white,
scrolledUnderElevation: 0,
),
body: RefreshIndicator(
2024-10-09 04:45:19 +00:00
displacement: 10,
onRefresh: () async =>
await context.read<ControlProvider>().getRelayStatus(),
child: SafeArea(
child: ListView(
children: [
2024-10-09 04:45:19 +00:00
Consumer<ControlProvider>(builder: (context, provider, child) {
switch (provider.relayState) {
case ResultState.loading:
return const StatusBarWidget(
text: 'Memuat...',
icon: BootstrapIcons.cloud,
color: Colors.cyan,
isLoading: true,
);
case ResultState.hasData:
return const StatusBarWidget(
text: 'Berhasil terhubung',
icon: BootstrapIcons.check_circle,
color: Colors.teal,
);
case ResultState.noData:
return const StatusBarWidget(
text: 'Data tidak ditemukan',
icon: BootstrapIcons.exclamation_circle,
color: Colors.amber,
);
case ResultState.initial:
return const SizedBox.shrink();
case ResultState.error:
return const StatusBarWidget(
text: 'Tidak dapat terhubung',
icon: BootstrapIcons.exclamation_circle,
color: Colors.red,
);
}
}),
SizedBox(height: 16.h),
GridView(
padding: EdgeInsets.all(16.r),
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 16.r,
mainAxisSpacing: 16.r,
childAspectRatio: 1.35.h,
),
children: [
ControlButtonWidget(
2024-10-24 07:09:30 +00:00
title: 'Katup Nutrisi',
subtitle: 'Relay 1',
isActive: provider.control_1,
onTap: () async {
final result = provider.control_1 != true
? await provider.switchRelay(1, true)
: await provider.switchRelay(1, false);
result == true
? provider.switchControl1(!provider.control_1)
: provider.switchControl1(provider.control_1);
},
2024-10-08 02:23:48 +00:00
),
ControlButtonWidget(
2024-10-24 07:09:30 +00:00
title: 'Katup Air',
subtitle: 'Relay 2',
isActive: provider.control_2,
2024-10-24 07:09:30 +00:00
onTap: () async {
final result = provider.control_2 != true
? await provider.switchRelay(2, true)
: await provider.switchRelay(2, false);
result == true
? provider.switchControl2(!provider.control_2)
: provider.switchControl2(provider.control_2);
},
),
],
),
],
),
),
),
);
}
}
2024-10-09 04:45:19 +00:00
class StatusBarWidget extends StatelessWidget {
const StatusBarWidget({
super.key,
2024-10-09 04:45:19 +00:00
required this.text,
required this.icon,
required this.color,
this.isLoading = false,
});
2024-10-09 04:45:19 +00:00
final String text;
final IconData icon;
final Color color;
final bool isLoading;
@override
Widget build(BuildContext context) {
return Container(
2024-10-09 04:45:19 +00:00
padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 16.w),
margin: EdgeInsets.all(16.r),
decoration: BoxDecoration(
2024-10-09 04:45:19 +00:00
color: color.withAlpha(50),
borderRadius: BorderRadius.circular(8.r),
),
2024-10-09 04:45:19 +00:00
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
2024-10-09 04:45:19 +00:00
Icon(
icon,
color: color,
size: 16.r,
),
SizedBox(width: 8.w),
Text(text, style: AppTheme.titleSmall.copyWith(color: color)),
const Spacer(),
2024-10-09 04:45:19 +00:00
if (isLoading)
Center(
child: CupertinoActivityIndicator(
radius: 8.r,
))
else
const SizedBox.shrink(),
],
2024-10-08 02:23:48 +00:00
),
2024-10-01 03:49:55 +00:00
);
}
}