diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 2915bd1..8de8e48 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -8,7 +8,7 @@ plugins { android { namespace = "com.example.qhdkfq_regulatory_flutter" compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion + ndkVersion = "28.1.13356709" compileOptions { sourceCompatibility = JavaVersion.VERSION_11 diff --git a/assets/images/avatar.png b/assets/images/avatar.png new file mode 100644 index 0000000..1492641 Binary files /dev/null and b/assets/images/avatar.png differ diff --git a/assets/images/banner.png b/assets/images/banner.png new file mode 100644 index 0000000..afc7ff3 Binary files /dev/null and b/assets/images/banner.png differ diff --git a/assets/images/bannerbg.png b/assets/images/bannerbg.png new file mode 100644 index 0000000..2efff7f Binary files /dev/null and b/assets/images/bannerbg.png differ diff --git a/assets/images/bg1.png b/assets/images/bg1.png new file mode 100644 index 0000000..1409628 Binary files /dev/null and b/assets/images/bg1.png differ diff --git a/assets/images/i1.png b/assets/images/i1.png new file mode 100644 index 0000000..cfec5c3 Binary files /dev/null and b/assets/images/i1.png differ diff --git a/assets/images/i2.png b/assets/images/i2.png new file mode 100644 index 0000000..c02daaf Binary files /dev/null and b/assets/images/i2.png differ diff --git a/assets/images/i3.png b/assets/images/i3.png new file mode 100644 index 0000000..e97bd6f Binary files /dev/null and b/assets/images/i3.png differ diff --git a/assets/images/i4.png b/assets/images/i4.png new file mode 100644 index 0000000..3de7ce3 Binary files /dev/null and b/assets/images/i4.png differ diff --git a/assets/images/i5.png b/assets/images/i5.png new file mode 100644 index 0000000..eda118a Binary files /dev/null and b/assets/images/i5.png differ diff --git a/assets/images/ico1.png b/assets/images/ico1.png new file mode 100644 index 0000000..000ce6e Binary files /dev/null and b/assets/images/ico1.png differ diff --git a/assets/images/ico10.png b/assets/images/ico10.png new file mode 100644 index 0000000..0e198b1 Binary files /dev/null and b/assets/images/ico10.png differ diff --git a/assets/images/ico2.png b/assets/images/ico2.png new file mode 100644 index 0000000..44e80e1 Binary files /dev/null and b/assets/images/ico2.png differ diff --git a/assets/images/ico4.png b/assets/images/ico4.png new file mode 100644 index 0000000..21541c2 Binary files /dev/null and b/assets/images/ico4.png differ diff --git a/assets/images/ico8.png b/assets/images/ico8.png new file mode 100644 index 0000000..9694540 Binary files /dev/null and b/assets/images/ico8.png differ diff --git a/assets/images/ico9.png b/assets/images/ico9.png new file mode 100644 index 0000000..d0f900f Binary files /dev/null and b/assets/images/ico9.png differ diff --git a/assets/images/login-bg.png b/assets/images/login-bg.png new file mode 100644 index 0000000..da5836d Binary files /dev/null and b/assets/images/login-bg.png differ diff --git a/assets/images/right.png b/assets/images/right.png new file mode 100644 index 0000000..b8ba30e Binary files /dev/null and b/assets/images/right.png differ diff --git a/assets/images/tx.png b/assets/images/tx.png new file mode 100644 index 0000000..1492641 Binary files /dev/null and b/assets/images/tx.png differ diff --git a/assets/tabbar/basics.png b/assets/tabbar/basics.png new file mode 100644 index 0000000..f2ad80a Binary files /dev/null and b/assets/tabbar/basics.png differ diff --git a/assets/tabbar/basics_cur.png b/assets/tabbar/basics_cur.png new file mode 100644 index 0000000..63b1965 Binary files /dev/null and b/assets/tabbar/basics_cur.png differ diff --git a/assets/tabbar/my.png b/assets/tabbar/my.png new file mode 100644 index 0000000..b5c45b8 Binary files /dev/null and b/assets/tabbar/my.png differ diff --git a/assets/tabbar/my_cur.png b/assets/tabbar/my_cur.png new file mode 100644 index 0000000..79d148a Binary files /dev/null and b/assets/tabbar/my_cur.png differ diff --git a/lib/home/danger_page.dart b/lib/home/danger_page.dart new file mode 100644 index 0000000..6aba5af --- /dev/null +++ b/lib/home/danger_page.dart @@ -0,0 +1,394 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + + +class DangerPage extends StatefulWidget { + const DangerPage({super.key}); + + @override + _DangerPageState createState() => _DangerPageState(); +} + +class _DangerPageState extends State { + String _selectedOption = '全部'; + final TextEditingController _searchController = TextEditingController(); + final List> enterprises = [ + { + 'name': '泰安安全', + 'type': '冶金行业', + 'unit': '执法一中队', + 'status': '已划分' + }, + { + 'name': '秦皇岛杰瑞科技有限公司', + 'type': '轻工行业', + 'unit': '执法一中队', + 'status': '已划分' + }, + { + 'name': '秦皇岛异特机械设备有限公司', + 'type': '机械行业', + 'unit': '执法一中队', + 'status': '已划分' + }, + { + 'name': '秦皇岛利华德科技有限公司', + 'type': '机械行业', + 'unit': '执法一中队', + 'status': '已划分' + }, + { + 'name': '广东胜捷消防科技有限公司秦皇岛分公司', + 'type': '机械行业', + 'unit': '执法一中队', + 'status': '未划分' + }, + { + 'name': '河北联技安全系统有限公司', + 'type': '轻工行业', + 'unit': '执法一中队', + 'status': '已划分' + }, + { + 'name': '秦皇岛市万天科技有限公司', + 'type': '轻工行业', + 'unit': '执法一中队', + 'status': '未划分' + }, + { + 'name': '秦皇岛市非晶科技有限公司', + 'type': '轻工行业', + 'unit': '执法一中队', + 'status': '已划分' + }, + { + 'name': '海湾安全技术有限公司', + 'type': '轻工行业', + 'unit': '执法一中队,西区消防大队', + 'status': '已划分' + }, + { + 'name': '秦皇岛海湾塑胶金属制品有限公司', + 'type': '轻工行业', + 'unit': '执法一中队', + 'status': '未划分' + }, + ]; + + List> get filteredEnterprises { + if (_searchController.text.isNotEmpty) { + return enterprises + .where((e) => e['name']!.contains(_searchController.text)) + .toList(); + } + + if (_selectedOption == '全部') { + return enterprises; + } else { + return enterprises + .where((e) => e['status'] == _selectedOption) + .toList(); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('企业信息'), + centerTitle: true, + actions: [ + IconButton( + icon: const Icon(Icons.filter_alt), + onPressed: () { + // 筛选功能 + }, + ), + ], + ), + body: Column( + children: [ + _buildFunctionButtons(), + _buildSearchSection(), + _buildFilterSection(), + _buildEnterpriseList(), + ], + ), + ); + } + + Widget _buildFunctionButtons() { + return Container( + padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 24), + color: Colors.white, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildFunctionButton('监管划分', Icons.assignment), + _buildFunctionButton('信息审核', Icons.verified), + _buildFunctionButton('持证人员', Icons.badge), + ], + ), + ); + } + + Widget _buildFunctionButton(String label, IconData icon) { + return Column( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: const Color(0xFF0D47A1).withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + ), + child: Icon(icon, size: 30, color: const Color(0xFF0D47A1)), + ), + const SizedBox(height: 8), + Text(label, style: const TextStyle(fontSize: 14)), + ], + ); + } + + Widget _buildSearchSection() { + return Container( + padding: const EdgeInsets.all(16), + color: Colors.white, + child: Row( + children: [ + Expanded( + child: TextField( + controller: _searchController, + decoration: InputDecoration( + hintText: '请输入关键字', + prefixIcon: const Icon(Icons.search), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(30), + borderSide: BorderSide.none, + ), + filled: true, + fillColor: Colors.grey[100], + contentPadding: const EdgeInsets.symmetric( + vertical: 12, horizontal: 20), + ), + onChanged: (value) { + setState(() {}); + }, + ), + ), + const SizedBox(width: 8), + Container( + decoration: BoxDecoration( + color: const Color(0xFF0D47A1), + borderRadius: BorderRadius.circular(30), + ), + child: IconButton( + icon: const Icon(Icons.search, color: Colors.white), + onPressed: () { + setState(() {}); + }, + ), + ), + ], + ), + ); + } + + Widget _buildFilterSection() { + return Container( + padding: const EdgeInsets.all(16), + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text('请选择部门', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), + const SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildFilterOption('全部'), + _buildFilterOption('已划分'), + _buildFilterOption('未划分'), + ], + ), + ], + ), + ); + } + + Widget _buildFilterOption(String text) { + final isSelected = _selectedOption == text; + + return GestureDetector( + onTap: () { + setState(() { + _selectedOption = text; + }); + }, + child: Row( + children: [ + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: isSelected ? const Color(0xFF0D47A1) : Colors.grey, + width: 2, + ), + ), + child: isSelected + ? Center( + child: Container( + width: 12, + height: 12, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Color(0xFF0D47A1), + ), + ), + ) + : null, + ), + const SizedBox(width: 8), + Text(text, style: TextStyle( + fontSize: 16, + color: isSelected ? const Color(0xFF0D47A1) : Colors.grey, + fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, + )), + ], + ), + ); + } + + Widget _buildEnterpriseList() { + return Expanded( + child: ListView.builder( + padding: const EdgeInsets.only(top: 8), + itemCount: filteredEnterprises.length, + itemBuilder: (context, index) { + final enterprise = filteredEnterprises[index]; + return _buildEnterpriseCard(enterprise); + }, + ), + ); + } + + Widget _buildEnterpriseCard(Map enterprise) { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + blurRadius: 8, + offset: const Offset(0, 4), + ) + ], + ), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + enterprise['name']!, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: enterprise['status'] == '已划分' + ? const Color(0xFF4CAF50).withOpacity(0.1) + : const Color(0xFFF44336).withOpacity(0.1), + borderRadius: BorderRadius.circular(4), + border: Border.all( + color: enterprise['status'] == '已划分' + ? const Color(0xFF4CAF50) + : const Color(0xFFF44336), + width: 1, + ), + ), + child: Text( + enterprise['status']!, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: enterprise['status'] == '已划分' + ? const Color(0xFF4CAF50) + : const Color(0xFFF44336), + ), + ), + ), + ], + ), + const SizedBox(height: 12), + Row( + children: [ + const Icon(Icons.business, size: 16, color: Colors.grey), + const SizedBox(width: 8), + Text( + '安全监管类型: ${enterprise['type']}', + style: const TextStyle(fontSize: 14, color: Colors.grey), + ), + ], + ), + const SizedBox(height: 8), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon(Icons.people, size: 16, color: Colors.grey), + const SizedBox(width: 8), + Expanded( + child: Text( + '管理单位: ${enterprise['unit']}', + style: const TextStyle(fontSize: 14, color: Colors.grey), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + // 查看详情 + }, + style: TextButton.styleFrom( + foregroundColor: const Color(0xFF0D47A1), + ), + child: const Text('查看详情'), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () { + // 处理操作 + }, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF0D47A1), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + ), + child: const Text('处理', style: TextStyle(color: Colors.white)), + ), + ], + ), + ], + ), + ), + ); + } +} + diff --git a/lib/home/home_page.dart b/lib/home/home_page.dart new file mode 100644 index 0000000..6896961 --- /dev/null +++ b/lib/home/home_page.dart @@ -0,0 +1,353 @@ +import 'dart:async'; +import 'dart:ffi'; +import 'package:flutter/material.dart'; +import 'package:flutter_html/flutter_html.dart'; + + +class HomePage extends StatefulWidget { + const HomePage({Key? key}) : super(key: key); + + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + + // 模拟数据 + final List> operations = [ + { + 'company': '通用电气-哈动力-南汽轮能源服务 (BSH) 有限公司', + 'type': '动火作业', + 'time': '2025-03-25 10:00', + }, + { + 'company': '通用电气-哈动力-南汽轮能源服务 (秦皇岛) BRA', + 'type': '高处作业', + 'time': '2025-03-21 09:00', + }, + { + 'company': '万基钢管 (秦皇岛) 有限公司', + 'type': '高处作业', + 'time': '2025-03-18 14:00', + }, + { + 'company': '通用电气-哈动力-南汽轮能源服务 (BSH) 有限公司', + 'type': '高处作业', + 'time': '2025-03-17 11:20', + }, + { + 'company': '通用电气-哈动力-南汽轮能源服务 (BSH) 有限公司', + 'type': '动火作业', + 'time': '2025-03-17 11:20', + }, + { + 'company': '粤海中粤 (秦皇岛) 马口铁工业有限公司', + 'type': '受限空间作业', + 'time': '2025-03-07 09:28', + }, + { + 'company': '粤海中粤 (秦皇岛) 马口铁工业有限公司', + 'type': '高处作业', + 'time': '2025-03-05 09:20', + }, + { + 'company': '通用电气-哈动力-南汽轮能源服务 (BSH) 有限公司', + 'type': '动火作业', + 'time': '2025-02-26 14:40', + }, + ]; + + Future _onRefresh() async { + // 模拟网络请求 + await Future.delayed(const Duration(seconds: 2)); + // 刷新数据逻辑,如 fetchData() + setState(() { + // TODO: 更新数据源 + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: RefreshIndicator( + onRefresh: _onRefresh, + child: ListView( + physics: const AlwaysScrollableScrollPhysics(), + + + children: [ + _buildBgImage(), + // _buildStatsCards(), + const SizedBox(height: 24), + _buildSectionTitle('企业排查情况'), + const SizedBox(height: 12), + _buildInspectionTable(), + const SizedBox(height: 24), + _buildSectionTitle('安全作业情况'), + const SizedBox(height: 12), + ..._buildOperationList(), + ], + + ), + ), + ); + } + + Widget _buildBgImage() { + return Stack( + alignment: const FractionalOffset(0.5, 1), + children: [ + Padding( + padding: EdgeInsetsGeometry.fromLTRB(0, 0, 0, 150), + child: Image.asset( + "assets/images/banner.png", + width: MediaQuery.of(context).size.width, // 获取屏幕宽度 + fit: BoxFit.cover), + ), + + _buildStatsCards(), + ], + ); + } + + + Widget _buildStatsCards() { + return + Container( + padding: const EdgeInsets.all(12), + margin: EdgeInsets.fromLTRB(12,0,12,0), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 8, + offset: const Offset(0, 4), + ) + ], + ), + + child: GridView.count( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + crossAxisCount: 4, + crossAxisSpacing: 16, + mainAxisSpacing: 16, + // childAspectRatio: 1.5, + children: [ + _buildStatCard('企业信息', "assets/images/ico1.png"), + _buildStatCard('双重预防', "assets/images/ico2.png"), + _buildStatCard('重点安全', "assets/images/ico4.png"), + _buildStatCard('监管帮扶', "assets/images/ico9.png"), + _buildStatCard('专项检查', "assets/images/ico8.png"), + _buildStatCard('防灾减灾', "assets/images/ico10.png"), + ], + + + ), + ); + } + + Widget _buildStatCard(String title, String icon ){ + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Container( + // padding: const EdgeInsets.all(12), + // decoration: BoxDecoration( + // color: color.withOpacity(0.1), + // shape: BoxShape.circle, + // ), + Image.asset(icon,width: 30,height: 30,fit:BoxFit.cover), + // child: Icon(icon, color: color, size: 32), + // ), + // const SizedBox(height: 12), + Padding( + padding: EdgeInsetsGeometry.fromLTRB(0,5,0,0), + child: Text(title, style: const TextStyle(fontSize: 16)) + ) + + ], + + + ); + } + + Widget _buildSectionTitle(String title) { + return Row( + children: [ + Container( + margin: EdgeInsets.fromLTRB(12,0,12,0), + width: 4, + height: 20, + decoration: BoxDecoration( + color: const Color(0xFF0D47A1), + borderRadius: BorderRadius.circular(2), + ), + ), + const SizedBox(width: 8), + Text(title, style: Theme.of(context).textTheme.titleMedium), + ], + ); + } + + Widget _buildInspectionTable() { + return Container( + margin: EdgeInsets.fromLTRB(12,0,12,0), + padding: const EdgeInsets.fromLTRB(16,16,16,10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 8, + offset: const Offset(0, 4), + ) + ], + ), + child: Table( + columnWidths: const { + 0: FlexColumnWidth(2), + 1: FlexColumnWidth(1), + 2: FlexColumnWidth(1), + }, + border: TableBorder( + horizontalInside: BorderSide(color: Colors.grey[200]!), + verticalInside: BorderSide(color: Colors.grey[200]!), + ), + children: [ + TableRow( + decoration: BoxDecoration(color: Colors.grey[100]), + children: [ + _buildTableCell('各单位的管辖企业数',Colors.black, isHeader: true), + _buildTableCell('已排查', Colors.black,isHeader: true), + _buildTableCell('未排查',Colors.black, isHeader: true), + ], + ), + TableRow( + children: [ + _buildTableCell('49',Colors.blue), + _buildTableCell('36',Colors.green), + _buildTableCell('13',Colors.orange), + ], + ), + ], + ), + ); + } + + Widget _buildTableCell(String text, Color color, {bool isHeader = false}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 8), + child: Text( + text, + style: TextStyle( + fontSize: 14, + fontWeight: isHeader ? FontWeight.bold : FontWeight.normal, + // color: isHeader ? const Color(0xFF333333) : const Color(0xFF666666), + color:color, + ), + textAlign: TextAlign.center, + ), + ); + } + + List _buildOperationList() { + return [ + Container( + margin: EdgeInsets.fromLTRB(12,0,12,0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 8, + offset: const Offset(0, 4), + ) + ], + ), + child: Column( + children: [ + for (int i = 0; i < operations.length; i++) + _buildOperationItem(operations[i], i), + ], + ), + ), + ]; + } + + Widget _buildOperationItem(Map operation, int index) { + return Container( + width: MediaQuery.of(context).size.width, // 获取屏幕宽度 + decoration: BoxDecoration( + border: Border( + bottom: index < operations.length - 1 + ? BorderSide(color: Colors.grey[200]!) + : BorderSide.none, + ), + ), + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + + children: [ + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + Text( + operation['company']!, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: Color(0xFF333333)), + // maxLines: 1, + // overflow: TextOverflow.ellipsis, + ), + // ], + // ), + const SizedBox(height: 8), + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: _getOperationColor(operation['type']!).withOpacity(0.1), + borderRadius: BorderRadius.circular(4), + ), + child: + Text( + operation['type']!, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: _getOperationColor(operation['type']!), + ), + ), + ), + + const SizedBox(height: 8), + Text( + '作业时间: ${operation['time']}', + style: const TextStyle(fontSize: 14, color: Color(0xFF666666)), + ), + ], + ), + ); + } + + Color _getOperationColor(String type) { + switch (type) { + case '动火作业': + return Colors.red; + case '高处作业': + return Colors.orange; + case '受限空间作业': + return Colors.purple; + default: + return Colors.blue; + } + } + + + +} + diff --git a/lib/main.dart b/lib/main.dart index 7b7f5b6..7547c72 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,122 +1,51 @@ import 'package:flutter/material.dart'; -void main() { - runApp(const MyApp()); +import 'package:shared_preferences/shared_preferences.dart'; +import './pages/login_page.dart'; // 导入登录页面 +import './pages/main_tab.dart'; // 导入主页(带TabBar的页面) +import 'package:intl/date_symbol_data_local.dart'; + +void main() async { + // 确保Flutter引擎初始化完成 + WidgetsFlutterBinding.ensureInitialized(); + await initializeDateFormatting('zh_CN', null); + + // 获取共享首选项实例 + final prefs = await SharedPreferences.getInstance(); + + // 获取登录状态 + final isLoggedIn = prefs.getBool('isLoggedIn') ?? false; + + runApp(MyApp(isLoggedIn: isLoggedIn)); } class MyApp extends StatelessWidget { - const MyApp({super.key}); + final bool isLoggedIn; + + const MyApp({super.key, required this.isLoggedIn}); - // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( - title: 'Flutter Demo', + title: '', theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. + dividerTheme: const DividerThemeData( + color: Colors.black12, + thickness: 1, // 线高 + indent: 0, // 左缩进 + endIndent: 0, // 右缩进 + ), + primarySwatch: Colors.blue, colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text('You have pushed the button this many times:'), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], + inputDecorationTheme: const InputDecorationTheme( + border: InputBorder.none, + contentPadding: EdgeInsets.symmetric(horizontal: 8), ), ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. + // 根据登录状态决定初始页面 + // home: isLoggedIn ? const MainPage() : const LoginPage(), + home:const LoginPage(), + debugShowCheckedModeBanner: false, ); } -} +} \ No newline at end of file diff --git a/lib/mine/mine_page.dart b/lib/mine/mine_page.dart new file mode 100644 index 0000000..3d8145c --- /dev/null +++ b/lib/mine/mine_page.dart @@ -0,0 +1,382 @@ +import 'package:flutter/material.dart'; + +class MinePage extends StatefulWidget { + const MinePage({super.key}); + + @override + State createState() => _MinePageState(); +} + + +class _MinePageState extends State { + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + title: '安全设置', + theme: ThemeData( + primarySwatch: Colors.blue, + scaffoldBackgroundColor: const Color(0xFFF5F7FA), + ), + home: const SafetySettingsPage(), + ); + } +} + +class SafetySettingsPage extends StatefulWidget { + const SafetySettingsPage({super.key}); + + @override + State createState() => _SafetySettingsPageState(); +} + +class _SafetySettingsPageState extends State { + // 设置项状态 + bool notificationsEnabled = false; + bool passwordChanged = false; + bool updateAvailable = false; + bool logoutSelected = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + // child: Padding( + // padding: const EdgeInsets.all(24.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 顶部标题区域 + _buildHeaderSection(), + const SizedBox(height: 15), + + // 标语区域 + // _buildSloganSection(), + // const SizedBox(height: 40), + // 图片区 + _buildCenterImage(), + const SizedBox(height: 15), + + // 设置项列表 + _buildSettingsList(), + const SizedBox(height: 40), + + // 底部按钮 + // _buildActionButton(), + ], + ), + // ), + ), + ); + } + + Widget _buildHeaderSection() { + return Stack( + alignment: const FractionalOffset(0.5, 1), + children: [ + + Padding( + padding: EdgeInsets.fromLTRB(0,0,0,30), + child: Image.asset( + "assets/images/bannerbg.png", + width: MediaQuery.of(context).size.width, // 获取屏幕宽度 + fit: BoxFit.cover, + ) + ), + + // 标语区域 + _buildSloganSection(), + const SizedBox(height: 40), + ], + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // const Text( + // "齐津诚", + // style: TextStyle( + // fontSize: 28, + // fontWeight: FontWeight.bold, + // color: Color(0xFF1A237E), + // ), + // ), + // const SizedBox(height: 8), + // Text( + // "齐津诚", + // style: TextStyle( + // fontSize: 18, + // color: Colors.grey[700], + // ), + // ), + // ], + + + ); + } + + Widget _buildSloganSection() { + return Container( + // padding: const EdgeInsets.all(24.0), + margin: EdgeInsets.fromLTRB(24,0,24,0), + padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 2, + blurRadius: 8, + offset: const Offset(0, 4), + ), + ], + ), + child: Row( + children: [ + CircleAvatar( + backgroundImage: AssetImage("assets/images/tx.png"), + radius: 30, + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "用户名称", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Color(0xFF000000), + ), + ), + Text( + "用户简介", + style: TextStyle( + fontSize: 14, + color: Colors.grey[600], + ), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildSettingsList() { + return Container( + margin: const EdgeInsets.fromLTRB(24,0,24,0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 2, + blurRadius: 8, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + children: [ + // 通知提醒 + _buildSettingItem( + title: "通知提醒", + icon: "assets/images/i2.png", + value: notificationsEnabled, + onChanged: (value) => setState(() => notificationsEnabled = value!), + ), + // const Divider(height: 1, indent: 60), + + // 修改密码 + _buildSettingItem( + title: "修改密码", + icon: "assets/images/i3.png", + value: passwordChanged, + onChanged: (value) => setState(() => passwordChanged = value!), + ), + // const Divider(height: 1, indent: 60), + + // 版本更新 + _buildSettingItem( + title: "版本更新", + icon: "assets/images/i5.png", + value: updateAvailable, + onChanged: (value) => setState(() => updateAvailable = value!), + ), + // const Divider(height: 1, indent: 60), + + // 退出登录 + _buildSettingItem( + title: "退出登录", + icon: "assets/images/i4.png", + value: logoutSelected, + onChanged: (value) { + setState(() => logoutSelected = value!); + if (value == true) { + _showLogoutConfirmation(); + } + }, + ), + ], + ), + ); + } + + Widget _buildSettingItem({ + required String title, + required String icon, + required bool value, + required ValueChanged onChanged, + }) { + return ListTile( + leading: Container( + width: 20, + height: 20, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + ), + child: Image.asset(icon ,fit: BoxFit.cover, ), + ), + title: Text( + title, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w500), + ), + + trailing: Transform.scale( + scale: 1.2, + child: Image.asset( + "assets/images/right.png", + fit: BoxFit.cover, + width: 15, + height: 15, + ), + ), + ); + } + + Widget _buildActionButton() { + return SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: () { + // 保存设置逻辑 + _saveSettings(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF1A237E), + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 3, // 注意:elevation应该放在styleFrom内部 + ), + child: const Text( + "保存设置", + style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600), + ), + ), + ); + } + + void _saveSettings() { + // 这里可以添加保存设置到服务器的逻辑 + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text("设置已保存成功"), + backgroundColor: Colors.green[700], + duration: const Duration(seconds: 2), + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + ), + ); + } + + void _showLogoutConfirmation() { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text("退出登录"), + content: const Text("确定要退出当前账号吗?"), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + actions: [ + TextButton( + onPressed: () { + setState(() => logoutSelected = false); + Navigator.pop(context); + }, + child: const Text("取消"), + ), + ElevatedButton( + onPressed: () { + // 执行退出登录操作 + Navigator.pop(context); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text("您已成功退出登录"), + backgroundColor: Colors.blue[700], + duration: const Duration(seconds: 2), + ), + ); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue[700], + foregroundColor: Colors.white, + ), + child: const Text("确定退出"), + ), + ], + ), + ); + } +} + +Widget _buildCenterImage (){ + return Stack( + children: [ + + Container( + margin: const EdgeInsets.fromLTRB(24,0,24,0), + height: 100, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + image: DecorationImage( + image: AssetImage('assets/images/bg1.png'), + fit: BoxFit.cover, + ), + ), + ), + Positioned( + top: 25, + left: 45, + child: Text( + "防范事故 保障安全", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Color(0xFF000000), + ), + ), + ), + Positioned( + top: 55, + left: 45, + child: Text( + "治理隐患,健康你我他", + style: TextStyle( + fontSize: 14, + color: Colors.grey[600], + ), + ), + ) + + ] + ); + + + +} diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart new file mode 100644 index 0000000..9c76e41 --- /dev/null +++ b/lib/pages/login_page.dart @@ -0,0 +1,292 @@ +// ignore_for_file: use_build_context_synchronously +import 'main_tab.dart'; +import 'package:flutter/material.dart'; + + +void main() => runApp(const MyApp()); + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: '登录页面', + theme: ThemeData( + primarySwatch: Colors.blue, + inputDecorationTheme: const InputDecorationTheme( + border: InputBorder.none, + contentPadding: EdgeInsets.symmetric(horizontal: 8), + ), + ), + home: const LoginPage(), + debugShowCheckedModeBanner: false, + ); + } +} + +class LoginPage extends StatefulWidget { + const LoginPage({super.key}); + + @override + // ignore: library_private_types_in_public_api + _LoginPageState createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + final TextEditingController _phoneController = TextEditingController(); + final TextEditingController _passwordController = TextEditingController(); + final GlobalKey _formKey = GlobalKey(); + String _errorMessage = ''; + bool _isLoading = false; + bool _obscurePassword = true; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: SingleChildScrollView( + child: Column( + children: [ + _buildHeader(), + + Transform.translate( + offset: const Offset(0, -60), + child: Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + child: Padding( + padding: const EdgeInsets.only(top: 30), + child: Column( + children: [ + + const Text( + '欢迎登录', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Colors.black, + shadows: [ + Shadow( + blurRadius: 10, + color: Colors.black45, + offset: Offset(2, 2), + ), + ], + ), + ), + const SizedBox(height: 12), + Text( + '秦皇岛开发区泰盛安管平台', + style: TextStyle(fontSize: 18, color: Colors.black), + ), + + // 手机号 + _buildInputSection( + label: "", + controller: _phoneController, + hintText: "请输入用户名", + keyboardType: TextInputType.phone, + validator: (value) { + if (value == null || value.isEmpty) { + return '请输入用户名'; + } + // if (!RegExp(r'^1[3-9]\d{9}$').hasMatch(value)) { + // return '请输入有效的手机号'; + // } + return null; + }, + ), + + Padding(padding: const EdgeInsets.symmetric(horizontal: 25), + child: const Divider(height: 1, thickness: 1), + ), + // 密码 + _buildInputSection( + label: "", + controller: _passwordController, + hintText: "请输入密码", + obscureText: _obscurePassword, + // suffixIcon: IconButton( + // icon: Icon( + // _obscurePassword + // ? Icons.visibility + // : Icons.visibility_off, + // color: Colors.grey, + // ), + // onPressed: () { + // setState(() { + // _obscurePassword = !_obscurePassword; + // }); + // }, + // ), + validator: (value) { + if (value == null || value.isEmpty) { + return '请输入密码'; + } + // if (value.length < 6) { + // return '密码长度至少6位'; + // } + return null; + }, + ), + Padding(padding: const EdgeInsets.symmetric(horizontal: 25), + child: const Divider(height: 1, thickness: 1), + ), + // 登录按钮 + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 25, vertical: 24), + child: SizedBox( + width: double.infinity, + height: 48, + child: ElevatedButton( + onPressed: _isLoading ? null : _handleLogin, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + child: _isLoading + ? const CircularProgressIndicator( + color: Colors.white, + ) + : const Text( + '登录', + style: TextStyle( + fontSize: 18, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + Padding(padding: const EdgeInsets.only(left: 30, right: 30), + child:Text(" 本平台为互联网非涉密平台,严禁处理、传输国家秘密和工作秘密", + style: TextStyle(color: Colors.red)) + ) + ], + ), + ), + ), + ), + ], + ), + ), + ); + } + + // 顶部图片和文字 + Widget _buildHeader() { + return Stack( + alignment: Alignment.center, + children: [ + Image.asset( + 'assets/images/login-bg.png', + width: double.infinity, + fit: BoxFit.fitWidth, + ), + Positioned( + bottom: 40, + left: 30, + child: Column( + children: [ + + ], + ), + ), + ], + ); + } + // 输入区域组件 + Widget _buildInputSection({ + required String label, + required TextEditingController controller, + required String hintText, + bool obscureText = false, + TextInputType keyboardType = TextInputType.text, + Widget? suffixIcon, + String? Function(String?)? validator, + }) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 25, vertical: 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: const TextStyle( + fontSize: 10, + fontWeight: FontWeight.w500, + color: Colors.black87, + ), + ), + const SizedBox(height: 15), + TextFormField( + controller: controller, + obscureText: obscureText, + keyboardType: keyboardType, + validator: validator, + // 关键属性:让文字在行内垂直居中 + textAlignVertical: TextAlignVertical.center, + decoration: InputDecoration( + hintText: hintText, + suffixIcon: suffixIcon, + // 去掉默认的上下/左右 padding,让文字贴紧外层的 25 左边距 + isDense: true, + contentPadding: EdgeInsets.zero, + ), + ), + ], + ), + ); + } + + + // 登录处理 + void _handleLogin() { + // 清除之前的错误信息 + setState(() => _errorMessage = ''); + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const MainPage()), + ); + + + + // if (_formKey.currentState?.validate() ?? false) { + // setState(() => _isLoading = true); + // + // // 模拟登录请求 + // Future.delayed(const Duration(seconds: 2), () { + // setState(() => _isLoading = false); + // // 登录成功,跳转到主页 + // // Navigator.pushReplacement( + // // context, + // // MaterialPageRoute(builder: (context) => const MainPage()), + // // ); + // // 模拟登录逻辑 + // if (_phoneController.text == "13800138000" && + // _passwordController.text == "123456") { + // // 登录成功,跳转到主页 + // Navigator.pushReplacement( + // context, + // MaterialPageRoute(builder: (context) => const MainPage()), + // ); + // } else { + // // 登录失败,显示错误信息 + // setState(() { + // _errorMessage = '手机号或密码错误,请重试'; + // }); + // } + // }); + // } + } +} diff --git a/lib/pages/main_tab.dart b/lib/pages/main_tab.dart new file mode 100644 index 0000000..1f27d69 --- /dev/null +++ b/lib/pages/main_tab.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; + +import 'package:qhdkfq_regulatory_flutter/home/home_page.dart'; +import 'package:qhdkfq_regulatory_flutter/mine/mine_page.dart'; + + +class MainPage extends StatefulWidget { + const MainPage({super.key}); + + @override + _MainPageState createState() => _MainPageState(); +} + +class _MainPageState extends State { + int _currentIndex = 0; + + // 页面列表 + final List _pages = const [ + HomePage(), + MinePage() + ]; + + // 页面标题 + final List _titles = [ + '首页', + '我的', + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: _currentIndex == 1 + ? null + : AppBar( + title: Text( + _currentIndex == 0 ? "秦皇岛开发区泰盛安管" : _titles[_currentIndex], + // _titles[_currentIndex], + style: const TextStyle( + fontSize: 17, + color: Colors.white, + ), + ), + centerTitle: true, + // backgroundColor: Colors.blue, + backgroundColor: _currentIndex == 0 ? Color(0xFF2A56F7) : Colors.blue, + actions: [ + // if (_currentIndex == 0) + // IconButton(onPressed: () { + // Navigator.push(context, MaterialPageRoute(builder: (context) => ScanPage() )); + // }, icon: Image.asset("assets/images/scan.png", width: 20, height: 20,)) + ], + ), + + body: _pages[_currentIndex], + bottomNavigationBar: BottomNavigationBar( + currentIndex: _currentIndex, + type: BottomNavigationBarType.fixed, // 保证超过3个图标不压缩 + selectedItemColor: Colors.blue, + unselectedItemColor: Colors.grey, + onTap: (index) => setState(() => _currentIndex = index), + items: [ + BottomNavigationBarItem( + icon: Image.asset('assets/tabbar/basics.png', width: 24, height: 24), + activeIcon: Image.asset('assets/tabbar/basics_cur.png', width: 24, height: 24), + label: '首页', + ), + BottomNavigationBarItem( + icon: Image.asset('assets/tabbar/my.png', width: 24, height: 24), + activeIcon: Image.asset('assets/tabbar/my_cur.png', width: 24, height: 24), + label: '我的', + ), + ], + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index fe26bf9..11dcbff 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,16 +5,16 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.12.0" + version: "2.13.0" boolean_selector: dependency: transitive description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" characters: @@ -22,7 +22,7 @@ packages: description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" clock: @@ -30,7 +30,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" collection: @@ -38,57 +38,318 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "1.19.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.3.4+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.8" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: "72d146c6d7098689ff5c5f66bcf593ac11efc530095385356e131070333e64da" + url: "https://pub.flutter-io.cn" + source: hosted + version: "11.3.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.flutter-io.cn" + source: hosted + version: "7.0.3" + dio: + dependency: "direct main" + description: + name: dio + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.8.0+1" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.1" + extended_image: + dependency: transitive + description: + name: extended_image + sha256: f6cbb1d798f51262ed1a3d93b4f1f2aa0d76128df39af18ecb77fa740f88b2e0 + url: "https://pub.flutter-io.cn" + source: hosted + version: "10.0.1" + extended_image_library: + dependency: transitive + description: + name: extended_image_library + sha256: "1f9a24d3a00c2633891c6a7b5cab2807999eb2d5b597e5133b63f49d113811fe" + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.0.1" fake_async: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.2" + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.1.4" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.9.3+2" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.9.4+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.9.3+4" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_html: + dependency: "direct main" + description: + name: flutter_html + sha256: "38a2fd702ffdf3243fb7441ab58aa1bc7e6922d95a50db76534de8260638558d" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.0.0" flutter_lints: dependency: "direct dev" description: name: flutter_lints sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "5.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.28" + flutter_screenutil: + dependency: "direct main" + description: + name: flutter_screenutil + sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de" + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.9.3" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + html: + dependency: transitive + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.15.6" + http: + dependency: transitive + description: + name: http + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.4.0" + http_client_helper: + dependency: transitive + description: + name: http_client_helper + sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.0.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.1.2" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.8.12+23" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.0.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.8.12+2" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.2.1+2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.2.1+2" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.10.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.2.1+1" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.20.2" + js: + dependency: transitive + description: + name: js + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.7.2" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + url: "https://pub.flutter-io.cn" source: hosted - version: "10.0.8" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.9" leak_tracker_testing: @@ -96,7 +357,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" lints: @@ -104,15 +365,23 @@ packages: description: name: lints sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" + list_counter: + dependency: transitive + description: + name: list_counter + sha256: c447ae3dfcd1c55f0152867090e67e219d42fe6d4f2807db4bbe8b8d69912237 + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.2" matcher: dependency: transitive description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "0.12.17" material_color_utilities: @@ -120,7 +389,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "0.11.1" meta: @@ -128,17 +397,273 @@ packages: description: name: meta sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.0" + mobile_scanner: + dependency: "direct main" + description: + name: mobile_scanner + sha256: "54005bdea7052d792d35b4fef0f84ec5ddc3a844b250ecd48dc192fb9b4ebc95" + url: "https://pub.flutter-io.cn" + source: hosted + version: "7.0.1" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.0" + oktoast: + dependency: "direct main" + description: + name: oktoast + sha256: f1366c5c793ddfb8f55bc6fc3e45db43c45debf173b765fb4c5ec096cbdeb84a + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.4.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.2.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.1" path: dependency: transitive description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "1.9.1" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.2.17" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 + url: "https://pub.flutter-io.cn" + source: hosted + version: "12.0.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" + url: "https://pub.flutter-io.cn" + source: hosted + version: "13.0.1" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + url: "https://pub.flutter-io.cn" + source: hosted + version: "9.4.7" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.2.1" + photo_manager: + dependency: transitive + description: + name: photo_manager + sha256: a0d9a7a9bc35eda02d33766412bde6d883a8b0acb86bbe37dac5f691a0894e8a + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.7.1" + photo_manager_image_provider: + dependency: transitive + description: + name: photo_manager_image_provider + sha256: b6015b67b32f345f57cf32c126f871bced2501236c405aafaefa885f7c821e4f + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.2.0" + photo_view: + dependency: "direct main" + description: + name: photo_view + sha256: "1fc3d970a91295fbd1364296575f854c9863f225505c28c46e0a03e48960c75e" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.15.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.8" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.1.5" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.5.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.10" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.5.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.1" + simple_gesture_detector: + dependency: transitive + description: + name: simple_gesture_detector + sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3 + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.2.1" sky_engine: dependency: transitive description: flutter @@ -149,7 +674,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "1.10.1" stack_trace: @@ -157,7 +682,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "1.12.1" stream_channel: @@ -165,7 +690,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" string_scanner: @@ -173,15 +698,23 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.1" + table_calendar: + dependency: "direct main" + description: + name: table_calendar + sha256: "0c0c6219878b363a2d5f40c7afb159d845f253d061dc3c822aa0d5fe0f721982" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.2.0" term_glyph: dependency: transitive description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.2" test_api: @@ -189,25 +722,225 @@ packages: description: name: test_api sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.4" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.4.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.3.1" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.3.16" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.3.3" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.2.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.2.2" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.1.4" vector_math: dependency: transitive description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" + video_player: + dependency: transitive + description: + name: video_player + sha256: "0d55b1f1a31e5ad4c4967bfaa8ade0240b07d20ee4af1dfef5f531056512961a" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.10.0" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "4a5135754a62dbc827a64a42ef1f8ed72c962e191c97e2d48744225c2b9ebb73" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.8.7" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: "0d47db6cbf72db61d86369219efd35c7f9d93515e1319da941ece81b1f21c49c" + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.7.2" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: cf2a1d29a284db648fd66cbd18aacc157f9862d77d2cc790f6f9678a46c1db5a + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.4.0" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: e8bba2e5d1e159d5048c9a491bb2a7b29c535c612bb7d10c1e21107f5bd365ba + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.3.5" + visibility_detector: + dependency: transitive + description: + name: visibility_detector + sha256: dd5cc11e13494f432d15939c3aa8ae76844c42b723398643ce9addb88a5ed420 + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.4.0+2" vm_service: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" - url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.flutter-io.cn" source: hosted - version: "14.3.1" + version: "15.0.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.1" + webview_flutter: + dependency: "direct main" + description: + name: webview_flutter + sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.13.0" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + sha256: f6e6afef6e234801da77170f7a1847ded8450778caf2fe13979d140484be3678 + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.7.0" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: f0dc2dc3a2b1e3a6abdd6801b9355ebfeb3b8f6cde6b9dc7c9235909c4a1f147 + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.13.1" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + sha256: a3d461fe3467014e05f3ac4962e5fdde2a4bf44c561cb53e9ae5c586600fdbc3 + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.22.0" + wechat_assets_picker: + dependency: "direct main" + description: + name: wechat_assets_picker + sha256: cafe3d32564ed3cacf9822f251941f7b44fe9885c17c8de4fca7e939a459e1ef + url: "https://pub.flutter-io.cn" + source: hosted + version: "9.5.1" + wechat_picker_library: + dependency: transitive + description: + name: wechat_picker_library + sha256: a42e09cb85b15fc9410f6a69671371cc60aa99c4a1f7967f6593a7f665f6f47a + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.5" + win32: + dependency: transitive + description: + name: win32 + sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.14.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.5" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.0" sdks: - dart: ">=3.7.0 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + dart: ">=3.8.0 <4.0.0" + flutter: ">=3.29.0" diff --git a/pubspec.yaml b/pubspec.yaml index 658875a..c6cb455 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,6 +34,43 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 + # 用于保存登录状态 + shared_preferences: ^2.2.2 + # 扫码 + mobile_scanner: ^7.0.1 + # 相册 + image_picker: ^1.1.2 + wechat_assets_picker: ^9.5.1 + # 日历 + table_calendar: ^3.2.0 + intl: ^0.20.0 + #图片查看大图 + photo_view: ^0.15.0 + + + # 状态管理 + provider: ^6.1.2 + # 屏幕适配相关 + flutter_screenutil: ^5.9.0-beta + # 网络请求 + dio: ^5.3.4 + # toast提示 + oktoast: ^3.3.1 + # 获取版本信息设备信息等 + package_info_plus: ^4.0.2 + device_info_plus: ^11.3.0 + # 权限申请 + permission_handler: ^12.0.1 # 使用最新版本 + #跳转到外部应用、scheme + url_launcher: ^6.1.6 + # webview + webview_flutter: ^4.2.2 + # 显示html文本 + flutter_html: ^3.0.0-alpha.6 + + + + dev_dependencies: flutter_test: @@ -57,6 +94,9 @@ flutter: # the material Icons class. uses-material-design: true + assets: + - assets/images/ + - assets/tabbar/ # To add assets to your application, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg