You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 03:22:32