275 lines
8.3 KiB
Dart
275 lines
8.3 KiB
Dart
import 'dart:ui';
|
||
|
||
import 'package:flutter/material.dart';
|
||
import 'package:qhd_prevention/customWidget/danner_repain_item.dart';
|
||
import 'package:qhd_prevention/customWidget/department_picker.dart';
|
||
import 'package:qhd_prevention/customWidget/search_bar_widget.dart';
|
||
import 'package:qhd_prevention/pages/home/scan_page.dart';
|
||
import 'package:qhd_prevention/pages/home/work/risk_list_page.dart';
|
||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||
import 'package:qhd_prevention/tools/SmallWidget.dart';
|
||
import 'package:qhd_prevention/tools/tools.dart';
|
||
|
||
class DangerPage extends StatefulWidget {
|
||
const DangerPage({super.key});
|
||
|
||
@override
|
||
_DangerPageState createState() => _DangerPageState();
|
||
}
|
||
|
||
class _DangerPageState extends State<DangerPage>
|
||
with SingleTickerProviderStateMixin {
|
||
late TabController _tabController;
|
||
int _selectedTab = 0;
|
||
|
||
// 模拟数据
|
||
final List<NotificationItem> _notifications = List.generate(10, (i) {
|
||
bool read = i % 3 == 0;
|
||
String title = '测试数据标题标题 ${i + 1}';
|
||
String time = '2025-06-${10 + i} 12:3${i}';
|
||
return NotificationItem(title, time);
|
||
});
|
||
final List<Category> data = [
|
||
Category(
|
||
id: '1',
|
||
title: '分类一',
|
||
children: [
|
||
Category(id: '1-1', title: '子项 1-1'),
|
||
Category(id: '1-2', title: '子项 1-2'),
|
||
],
|
||
),
|
||
Category(id: '2', title: '分类二'),
|
||
Category(
|
||
id: '3',
|
||
title: '分类三',
|
||
children: [
|
||
Category(
|
||
id: '3-1',
|
||
title: '子项 3-1',
|
||
children: [Category(id: '3-1-1', title: '子项 3-1-1')],
|
||
),
|
||
],
|
||
),
|
||
];
|
||
final TextEditingController _searchController = TextEditingController();
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
_tabController = TabController(length: 2, vsync: this);
|
||
_tabController.addListener(() {
|
||
if (!_tabController.indexIsChanging) {
|
||
setState(() => _selectedTab = _tabController.index);
|
||
}
|
||
});
|
||
}
|
||
|
||
@override
|
||
void dispose() {
|
||
_tabController.dispose();
|
||
super.dispose();
|
||
}
|
||
void _handleItemTap(NotificationItem item, int index) {
|
||
print("点击了是: ${item.title}");
|
||
pushPage(RiskListPage(), context);
|
||
}
|
||
// 显示分类选择器
|
||
void showCategoryPicker() {
|
||
showModalBottomSheet(
|
||
context: context,
|
||
isScrollControlled: true,
|
||
barrierColor: Colors.black54,
|
||
backgroundColor: Colors.transparent,
|
||
builder:
|
||
(ctx) => DepartmentPicker(
|
||
data: data,
|
||
onSelected: (selectedId) {
|
||
setState(() {});
|
||
},
|
||
),
|
||
);
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Scaffold(
|
||
appBar: MyAppbar(
|
||
title: "隐患排查",
|
||
actions: [
|
||
TextButton(
|
||
onPressed: () {
|
||
pushPage(ScanPage(), context);
|
||
},
|
||
child: Text(
|
||
"清单扫描",
|
||
style: TextStyle(color: Colors.white, fontSize: 16),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
body: SafeArea(
|
||
child: Column(
|
||
children: [
|
||
// Tab bar
|
||
TabBar(
|
||
controller: _tabController,
|
||
labelStyle: TextStyle(fontSize: 16),
|
||
indicator: UnderlineTabIndicator(
|
||
borderSide: BorderSide(width: 3.0, color: Colors.blue),
|
||
insets: EdgeInsets.symmetric(horizontal: 100.0),
|
||
),
|
||
labelColor: Colors.blue,
|
||
unselectedLabelColor: Colors.grey,
|
||
tabs: const [Tab(text: '待排查'), Tab(text: '已排查')],
|
||
),
|
||
|
||
// Search bar
|
||
Padding(
|
||
padding: const EdgeInsets.all(10),
|
||
child: SearchBarWidget(
|
||
showResetButton: true,
|
||
onInputTap: () {
|
||
showCategoryPicker();
|
||
},
|
||
hintText: "",
|
||
isClickableOnly: true,
|
||
onSearch: (text) {
|
||
print('----------');
|
||
},
|
||
controller: _searchController,
|
||
),
|
||
),
|
||
|
||
// List
|
||
Expanded(
|
||
child: ListView.separated(
|
||
itemCount: _notifications.length,
|
||
separatorBuilder: (_, __) => const SizedBox(),
|
||
itemBuilder: (context, index) {
|
||
NotificationItem item = _notifications[index];
|
||
return GestureDetector(
|
||
onTap: () => _handleItemTap(item, index),
|
||
child: DannerRepainItem(
|
||
title: '测试--------new',
|
||
details: [
|
||
'清单类型:测试',
|
||
'排查周期:测试',
|
||
'包含检查项:3',
|
||
'负责人:是测试',
|
||
'起始时间:2025-6-20',
|
||
'',
|
||
'测试一下是否跳过时间'
|
||
],
|
||
showBottomTags: true,
|
||
bottomTags: [
|
||
riskTagText(1, "重大风险:0"),
|
||
riskTagText(2, "较大:3"),
|
||
riskTagText(3, "一般:1"),
|
||
riskTagText(4, "低:0"),
|
||
],
|
||
),
|
||
);
|
||
},
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
);
|
||
}
|
||
|
||
Widget _itemCell(final item) {
|
||
return Padding(
|
||
padding: EdgeInsets.only(left: 15, right: 15, bottom: 15),
|
||
child: Container(
|
||
decoration: const BoxDecoration(
|
||
color: Colors.white,
|
||
borderRadius: BorderRadius.all(Radius.circular(5)),
|
||
),
|
||
child: Column(
|
||
children: [
|
||
Padding(
|
||
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 15),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||
children: [
|
||
Row(
|
||
children: [
|
||
Icon(
|
||
Icons.star_rate_sharp,
|
||
color: Colors.green,
|
||
size: 18,
|
||
),
|
||
SizedBox(width: 5),
|
||
Text("测试--------", style: TextStyle(fontSize: 14)),
|
||
],
|
||
),
|
||
Icon(
|
||
Icons.arrow_forward_ios_rounded,
|
||
color: Colors.grey,
|
||
size: 15,
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Divider(height: 1),
|
||
Padding(
|
||
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 15),
|
||
child: Column(
|
||
spacing: 5,
|
||
children: [
|
||
Row(
|
||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||
children: [
|
||
HhTextStyleUtils.secondaryTitle("清单类型:测试"),
|
||
HhTextStyleUtils.secondaryTitle("排查周期:测试"),
|
||
],
|
||
),
|
||
Row(
|
||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||
children: [
|
||
HhTextStyleUtils.secondaryTitle("包含检查项:3"),
|
||
HhTextStyleUtils.secondaryTitle("负责人:是测试"),
|
||
],
|
||
),
|
||
Row(
|
||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||
children: [
|
||
HhTextStyleUtils.secondaryTitle(
|
||
"起始时间:2025-6-20 - 2026-3-31",
|
||
),
|
||
SizedBox(),
|
||
],
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Padding(
|
||
padding: EdgeInsets.only(top: 0, bottom: 15, left: 15, right: 15),
|
||
child: Row(
|
||
spacing: 5,
|
||
children: [
|
||
riskTagText(1, "重大风险:0"),
|
||
riskTagText(2, "较大:3"),
|
||
riskTagText(3, "一般:1"),
|
||
riskTagText(4, "低:0")
|
||
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
);
|
||
}
|
||
|
||
}
|
||
|
||
// 模拟数据模版
|
||
class NotificationItem {
|
||
final String title;
|
||
final String time;
|
||
|
||
NotificationItem(this.title, this.time);
|
||
}
|