### LaoDongFaController - GetX Singleton Source: https://context7.com/ctkqiang/zhongguolaodongfa_app/llms.txt Shows how to access the singleton instance of LaoDongFaController, load data asynchronously, and observe reactive data changes using Obx. It also includes an example of handling user interaction for chapter selection. ```dart import 'package:get/get.dart'; import 'package:zhongguolaodongfa_app/controller/laodongfa_controller.dart'; // 获取控制器单例实例 final controller = LaoDongFaController.instance; // 异步获取劳动法内容列表 Future loadData() async { List? contents = await controller.getContents(); if (contents != null && contents.isNotEmpty) { // 遍历所有章节 for (var chapter in contents) { print('章节: ${chapter!.chapter}'); print('条款数量: ${chapter.body!.length}'); } } } // 监听响应式数据变化 Obx(() { final data = controller.contents.value; if (data == null) return CircularProgressIndicator(); return ListView.builder( itemCount: data.length, itemBuilder: (ctx, i) => Text(data[i]!.chapter!), ); }); // 处理用户点击章节事件,导航到详情页 controller.onTap(laodongfa: selectedChapter); ``` -------------------------------- ### Implement SplashScreen and Navigation Source: https://context7.com/ctkqiang/zhongguolaodongfa_app/llms.txt Configures the application entry point and handles automatic navigation to the home page after a 2-second delay. ```dart import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:zhongguolaodongfa_app/pages/splash.dart'; // SplashScreen作为应用入口页面 class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return GetMaterialApp( title: "中国劳动法手册", theme: ThemeData( primarySwatch: Colors.red, fontFamily: "main", ), home: const SplashScreen(), // 启动页作为首页 ); } } // SplashScreen自动跳转逻辑 @override void initState() { super.initState(); // 延迟2秒后跳转到主页 Future.delayed(const Duration(seconds: 2), () { Get.to(const HomePage()); }); } // 启动页UI: 居中显示Logo图片 Center( child: Image.asset("assets/logo.png", height: 300, width: 300), ); ``` -------------------------------- ### Configure Dependency Injection Source: https://context7.com/ctkqiang/zhongguolaodongfa_app/llms.txt Uses GetX Bindings to register the LaoDongFaController as a global singleton. ```dart import 'package:get/get.dart'; import 'package:zhongguolaodongfa_app/binding/binding.dart'; import 'package:zhongguolaodongfa_app/controller/laodongfa_controller.dart'; // 在GetMaterialApp中使用Binding GetMaterialApp( initialBinding: Binding(), home: const SplashScreen(), ); // Binding类实现 class Binding extends Bindings { @override void dependencies() { // 注册LaoDongFaController为全局单例 Get.put(LaoDongFaController()); } } // 在任意位置获取控制器实例 final controller = Get.find(); // 或使用静态实例方法 final controller = LaoDongFaController.instance; ``` -------------------------------- ### Implement ContentViewer Page Source: https://context7.com/ctkqiang/zhongguolaodongfa_app/llms.txt Displays legal articles in a list format using a ListView. Each item is clickable to trigger a screenshot function. ```dart import 'package:flutter/material.dart'; import 'package:zhongguolaodongfa_app/pages/content_viewer.dart'; import 'package:zhongguolaodongfa_app/model/laodongfa.dart'; // 创建法条详情页 LaoDongFa chapter = LaoDongFa( chapter: "第一章 总 则", body: [ "第一条 为了保护劳动者的合法权益...", "第二条 在中华人民共和国境内的企业...", "第三条 劳动者享有平等就业和选择职业的权利...", ], ); // 导航到详情页 Get.to(() => ContentViewer(laoDongFa: chapter)); // ContentViewer页面结构: // - AppBar: 显示章节标题 // - Body: ListView展示法条列表 // - ListTile: 每个法条可点击触发截图 // 内部ListView构建 ListView( children: widget.laoDongFa!.body!.map((item) { return ListTile( title: Text( "\n$item\n", style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 20, fontFamily: "main", ), ), onTap: () => _laodongfaController.screenShot(item), ); }).toList(), ); ``` -------------------------------- ### HomePage Widget with FutureBuilder Source: https://context7.com/ctkqiang/zhongguolaodongfa_app/llms.txt Presents the HomePage widget, which displays a list of labor law chapters. It utilizes FutureBuilder for asynchronous data loading and ListView for rendering tappable chapter items. Navigation to detail pages is handled via onTap. ```dart import 'package:flutter/material.dart'; import 'package:zhongguolaodongfa_app/pages/home.dart'; // 在应用中导航到主页 Get.to(() => const HomePage()); // HomePage内部结构: // - AppBar: 显示应用标题"中国劳动法手册"和信息按钮 // - Body: FutureBuilder加载章节列表 // - ListView: 展示所有章节,支持点击导航到详情 // FutureBuilder使用示例 FutureBuilder?>( key: const Key("future::chapter"), future: _laodongfaController.getContents(), builder: (context, snapshot) { if (!(snapshot.hasData)) { return const Center(child: Text("这里好像出了一些问题。")); } return ListView( children: snapshot.data!.map((item) { return ListTile( title: Text( item!.chapter!, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 20, fontFamily: "main", ), ), onTap: () => _laodongfaController.onTap(laodongfa: item), ); }).toList(), ); }, ); ``` -------------------------------- ### Screenshot and Sharing Functionality Source: https://context7.com/ctkqiang/zhongguolaodongfa_app/llms.txt Details the screenShot() method for capturing specific article content as an image with custom styling. The code comments outline the styling parameters and note that the sharing functionality is currently commented out. ```dart import 'package:zhongguolaodongfa_app/controller/laodongfa_controller.dart'; final controller = LaoDongFaController.instance; // 对指定法条内容生成截图 String articleContent = "第一条 为了保护劳动者的合法权益,调整劳动关系..."; controller.screenShot(articleContent); // 截图生成的Widget样式: // - 红色背景 (Colors.red) // - 黄色粗体文字 (Colors.yellow, FontWeight.bold) // - 字体大小: 30 // - 内边距: 40 // - 包含引用内容和应用名称《中国劳动法手册》 // 截图完成后调用 saveAndShareImg() 保存并分享 // 注: 当前版本分享功能已注释,可取消注释启用 ``` -------------------------------- ### API Data Fetching with Error Handling Source: https://context7.com/ctkqiang/zhongguolaodongfa_app/llms.txt Illustrates how to call the getContents() method to fetch labor law data from a remote API. Includes a basic try-catch block for handling HTTP errors and logging, with comments explaining common error codes. ```dart import 'package:zhongguolaodongfa_app/controller/laodongfa_controller.dart'; // API响应数据结构示例 /* { "laodongfa": { "content": [ { "chapter": "第一章 总 则", "body": ["第一条 ...", "第二条 ..."] }, { "chapter": "第二章 促进就业", "body": ["第十条 ...", "第十一条 ..."] } ] } } */ final controller = LaoDongFaController.instance; // 调用API获取数据 try { List? result = await controller.getContents(); // 成功获取数据 (HTTP 200) if (result != null) { print('成功加载 ${result.length} 个章节'); // 访问第一章内容 var firstChapter = result.first; print('第一章标题: ${firstChapter!.chapter}'); print('第一章条款数: ${firstChapter.body!.length}'); } } catch (e) { // HTTP错误码处理: // 400 - 客户端错误,服务器无法或不会处理请求 // 403 - 服务器理解请求,但拒绝授权 // 404 - 请求的API不可用 // 500 - 服务器遇到意外情况,无法完成请求 print('加载失败: $e'); } ``` -------------------------------- ### Manage Application Constants Source: https://context7.com/ctkqiang/zhongguolaodongfa_app/llms.txt Defines global configuration constants such as app name and API endpoints for centralized management. ```dart // lib/constant/Strings.dart // 应用名称 var appName = "中国劳动法手册"; // 劳动法数据API地址 (GitHub Gist托管的JSON数据) String? ldfurl = "https://gist.githubusercontent.com/ctkqiang/926def4ddcfa9345ce60c6e0da92a080/raw/46de1298cbb914d9697d26b69c7fc9783c726e47/%25E4%25B8%25AD%25E5%259B%25BD%25E5%258A%25B3%25E5%258A%25A8%25E6%25B3%2595.json"; // 开发者GitHub主页 String? github = "https://github.com/ctkqiang"; // 在应用中使用 import 'package:zhongguolaodongfa_app/constant/Strings.dart'; Text(appName); // 显示: 中国劳动法手册 http.get(Uri.parse(ldfurl!)); // 请求API数据 ``` -------------------------------- ### LaoDongFa Data Model Parsing Source: https://context7.com/ctkqiang/zhongguolaodongfa_app/llms.txt Demonstrates how to create a LaoDongFa object from JSON data and convert it back to JSON. Ensure the JSON structure matches the expected format for serialization and deserialization. ```dart import 'package:zhongguolaodongfa_app/model/laodongfa.dart'; // 从JSON数据创建劳动法对象 final jsonData = { "chapter": "第一章 总 则", "body": [ "第一条 为了保护劳动者的合法权益,调整劳动关系...", "第二条 在中华人民共和国境内的企业、个体经济组织..." ] }; LaoDongFa laodongfa = LaoDongFa.fromJson(jsonData); // 访问章节标题 print(laodongfa.chapter); // 输出: 第一章 总 则 // 访问法条内容列表 for (var article in laodongfa.body!) { print(article); } // 转换回JSON格式 Map json = laodongfa.toJson(); // 输出: {"chapter": "第一章 总 则", "body": [...]} ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.