Dart/Flutter技术实现:基于指定日期生成600天日期序列并在Text Widget中展示
嘿,这两个Flutter日期处理的需求我帮你搞定啦,直接上代码和关键说明,清晰易懂!
1. 基于DateTime变量生成600天循环并在Text Widget展示
首先我们需要一个起始DateTime,然后循环600次逐天累加,把每个日期格式化后存进列表,最后把列表转成字符串展示在Text里。这里我用当前日期作为起始示例,你可以换成任意固定日期。
import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { // 自定义起始日期,这里用当前日期,你也可以写成 DateTime(2021, 11, 19) final startDate = DateTime.now(); List<String> dateList = []; // 循环生成600天的日期 for (int i = 0; i < 600; i++) { // 每次累加i天 final currentDate = startDate.add(Duration(days: i)); // 格式化为dd/MM/yyyy的字符串 dateList.add(DateFormat('dd/MM/yyyy').format(currentDate)); } return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('600天日期列表')), body: Padding( padding: const EdgeInsets.all(16.0), // 用换行分隔每个日期,方便阅读 child: Text(dateList.join('\n')), ), ), ); } }
关键点说明:
- 要使用
DateFormat的话,需要在pubspec.yaml里添加依赖:intl: ^0.18.1,然后执行flutter pub get DateTime.add(Duration(days: i))是核心的日期累加方法,能准确处理跨月、跨年的情况- 用
join('\n')把列表转成带换行的字符串,让Text能逐行显示日期
2. 处理用户输入的指定日期,生成往后600天的列表
这个需求需要用户输入日期,所以我们得用TextField获取输入,然后解析成DateTime,再生成后续日期列表。因为涉及到状态变化(输入、生成列表),所以用StatefulWidget来管理。
import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: const CustomDateGenerator(), ); } } class CustomDateGenerator extends StatefulWidget { const CustomDateGenerator({super.key}); @override State<CustomDateGenerator> createState() => _CustomDateGeneratorState(); } class _CustomDateGeneratorState extends State<CustomDateGenerator> { final TextEditingController _dateController = TextEditingController(); List<String> _generatedDates = []; String? _errorTip; // 解析输入并生成日期列表的方法 void _createDateList() { setState(() { _errorTip = null; _generatedDates.clear(); final inputStr = _dateController.text.trim(); try { // 严格解析dd/MM/yyyy格式的输入,第二个参数true表示严格匹配格式 final startDate = DateFormat('dd/MM/yyyy').parseStrict(inputStr); // 循环生成往后600天的日期 for (int i = 0; i < 600; i++) { final currentDate = startDate.add(Duration(days: i)); _generatedDates.add(DateFormat('dd/MM/yyyy').format(currentDate)); } } catch (e) { // 解析失败时显示错误提示 _errorTip = '请输入正确的日期格式(比如:19/11/2021)'; } }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('自定义起始日期生成600天')), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ TextField( controller: _dateController, decoration: InputDecoration( labelText: '输入起始日期', hintText: '示例:19/11/2021', errorText: _errorTip, border: const OutlineInputBorder(), ), ), const SizedBox(height: 16), ElevatedButton( onPressed: _createDateList, child: const Text('生成日期列表'), ), const SizedBox(height: 16), // 用Expanded和SingleChildScrollView处理长列表的滚动 Expanded( child: SingleChildScrollView( child: Text(_generatedDates.join('\n')), ), ), ], ), ), ); } @override void dispose() { // 记得销毁控制器,避免内存泄漏 _dateController.dispose(); super.dispose(); } }
关键点说明:
- 用
parseStrict方法严格解析输入,避免用户输入格式错误的日期(比如把月份和日期搞混) - 用
try-catch捕获解析异常,给用户友好的错误提示 - 因为600行内容很长,所以用
SingleChildScrollView包裹Text,让用户可以滚动查看全部日期 - 记得在
dispose方法里销毁TextEditingController,防止内存泄漏
内容的提问来源于stack exchange,提问作者Kalias 29
相关产品推荐
相关产品推荐

