pda_template/lib/features/page/presentation/home.dart

252 lines
8.0 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:yaml/yaml.dart';
import 'package:bruno/bruno.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '/core/di/providers.dart';
import '/app/enum/config_path_enum.dart';
import '/app/enum/wms_api_response_code.dart';
import '/core/utils/extensions/dialogUtils.dart';
import '/features/page/domain/models/base_wms_api_response.dart';
import '../../stock/presentation/screens/stock_in_empty_screen.dart';
import '../../stock/presentation/screens/stock_in_manual_screen.dart';
import '../../stock/presentation/screens/stock_out_empty_screen.dart';
class Home extends ConsumerStatefulWidget {
const Home({super.key});
@override
ConsumerState<Home> createState() => _HomePageState();
}
class _HomePageState extends ConsumerState<Home> {
List<BrnDoughnutDataItem> stockChartsData = [];
late Color primaryColor;
bool _isLoading = true;
AsyncValue<PageBaseWmsApiResponse?>? _previousState;
bool _hasSubmitted = false;
@override
void initState() {
super.initState();
_loadConfig();
setState(() {
stockChartsData = [
BrnDoughnutDataItem(value: 40, title: "空闲", color: Colors.green),
BrnDoughnutDataItem(value: 60, title: "占用", color: Colors.orange),
];
});
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
final currentState = ref.read(pageNotifierProvider);
if (_previousState != currentState && _hasSubmitted) {
_previousState = currentState;
Future.microtask(() => _handleState(currentState));
} else {
_previousState = currentState;
}
}
Future<void> _loadConfig() async {
final configString = await rootBundle.loadString(
ConfigPathEnum.uiConfig.configPath,
);
final config = loadYaml(configString);
setState(() {
primaryColor = Color(config['theme']['primaryColor']);
_isLoading = false;
});
}
@override
Widget build(BuildContext context) {
if (_isLoading) {
return Scaffold(body: Center(child: CircularProgressIndicator()));
}
ref.listen(pageNotifierProvider, (previous, next) {
if (previous != next && _hasSubmitted) {
_previousState = next;
Future.microtask(() => _handleState(next));
}
});
return Scaffold(
appBar: AppBar(
iconTheme: const IconThemeData(color: Colors.white),
centerTitle: true,
backgroundColor: primaryColor,
title: const Text("WMS移动终端模板", style: TextStyle(color: Colors.white)),
),
drawer: Drawer(
backgroundColor: Colors.white,
child: ListView(
padding: const EdgeInsets.all(0),
children: [
UserAccountsDrawerHeader(
accountName: const Text("模板"),
accountEmail: const Text("欢迎使用WMS移动终端"),
decoration: BoxDecoration(color: primaryColor),
),
ListTile(
title: const Text("空载具入库"),
trailing: const Icon(Icons.grain),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const StockInEmpty()),
);
},
),
ListTile(
title: const Text("手动码盘入库"),
trailing: const Icon(Icons.add_box),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const StockInManual(),
),
);
},
),
// ListTile(
// title: const Text("EBS码盘入库"),
// trailing: const Icon(Icons.add_box),
// onTap: () {
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => const StockInEBS(),
// ),
// );
// },
// ),
ListTile(
title: const Text("呼叫空托"),
trailing: const Icon(Icons.ac_unit),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const StockOutEmpty(),
),
);
},
),
// ListTile(
// title: const Text("出库拣货"),
// trailing: const Icon(Icons.back_hand),
// onTap: () {
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => const Pick()),
// );
// },
// ),
// ListTile(title: const Text("库存盘点"), trailing: const Icon(Icons.checklist), onTap: () {
// Navigator.push(context, MaterialPageRoute(builder: (context) => const StockCheck()));
// }),
// ListTile(title: const Text("库存查询"), trailing: const Icon(Icons.list_alt), onTap: () {
// Navigator.push(context, MaterialPageRoute(builder: (context) => const StockSearch()));
// })
],
),
),
body: Padding(
padding: const EdgeInsets.only(top: 10, left: 20, right: 20),
child: ListView(
children: [
const Text("库存占用情况:"),
Row(
children: [
Column(
children: [
BrnDoughnutChart(
padding: const EdgeInsets.all(50),
width: 150,
height: 150,
data: stockChartsData,
showTitleWhenSelected: false,
),
],
),
Column(
children: [
DoughnutChartLegend(
data: stockChartsData,
legendStyle: BrnDoughnutChartLegendStyle.list,
),
],
),
],
),
Padding(
padding: const EdgeInsets.only(top: 10),
child: SizedBox(
width: 250,
child: ElevatedButton(
onPressed: test,
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(primaryColor),
),
child: const Text(
"网络检测",
style: TextStyle(color: Colors.white),
),
),
),
),
],
),
),
);
}
void test() {
// 标记已提交请求
_hasSubmitted = true;
ref.read(pageNotifierProvider.notifier).submit();
}
void _handleState(AsyncValue<PageBaseWmsApiResponse?> state) {
state.whenOrNull(
loading: () => BrnLoadingDialog.show(context, content: "正在请求"),
error: (error, _) {
BrnLoadingDialog.dismiss(context);
DialogUtils.showErrorMessage(context, "请求发生错误", error.toString());
_hasSubmitted = false;
},
data: (response) {
BrnLoadingDialog.dismiss(context);
if (response != null &&
response.code == WmsApiResponseCode.success.code) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text("请求成功"),
duration: const Duration(seconds: 2),
behavior: SnackBarBehavior.floating,
backgroundColor: Colors.green,
margin: const EdgeInsets.only(bottom: 100, left: 20, right: 20),
),
);
_hasSubmitted = false;
} else if (response != null) {
DialogUtils.showWarningMessage(
context,
"操作未成功",
"${response.message} ${response.code.toString()}",
btnLabel: "返回",
);
}
},
);
}
}