当前位置: 首页 > news >正文

Flutter---个人信息(4)---实现修改生日日期

效果图

整体框架

HomePage (首页)
↓ (传递回调函数)
PersonInformationPage (个人信息页)
↓ (打开生日选择器)
BirthdayDialog (生日选择弹窗)
↓ (用户选择)
数据回传更新

用户交互数据流

用户点击生日行 
→ changeBirthdayDialog() 
→ 显示日期选择器 
→ 用户选择年月日 
→ 格式化日期 
→ 更新本地状态 
→ 回调父组件 
→ 关闭弹窗

弹窗UI布局结构

Stack(children: [// 底层:CupertinoPickerCupertinoPicker(...),// 中层:上下横线Positioned(top: 40, child: Divider()),Positioned(bottom: 40, child: Divider()),// 上层:单位标签Positioned(top: 48, child: Text("年")),],
)

实现步骤

1.添加回调函数

final Function(String) onBirthdayChanged;//1,添加回调函数

2.添加必须传入的生日回调函数

const PersonInformationPage({super.key,required this.onNameChanged,required this.onGenderChanged,required this.onBirthdayChanged,//2.添加必须传入的生日回调函数});

3.设置修改生日的提示框

               onTap: () {//3.设置修改生日的提示框changeBirthdayDialog();},

4.构建选择生日的弹窗

  //==========================选择生日的弹窗=====================================//void changeBirthdayDialog() {//1.设定初始值int selectedYear = 1900; //从哪一年开始int selectedMonth = 1; //默认选中月份int selectedDay = 1; //默认选中日期//2.设置年的初始选中项为2000:意思就是往后滑动一百项,1900+100 = 2000final controllerYear = FixedExtentScrollController(initialItem: 100);showDialog(context: context,builder: (context) {return Dialog(backgroundColor: Colors.white,shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(26),),child: Container(width: 320,padding: const EdgeInsets.all(16),child: Column(mainAxisSize: MainAxisSize.min,children: [const SizedBox(height: 16),// 3.自定义年月日选择器Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [// 年份选择Expanded(child: Column(children: [SizedBox(height: 120,child: Stack(children: [CupertinoPicker(itemExtent: 40, //选中项的高度scrollController: controllerYear,//设置初始选中项的值(2000)onSelectedItemChanged: (int index) { //当选中项变化时触发,参数为索引selectedYear = 1900 + index; //存储用户选择的数据(将数组索引转换为实际的年份值)},// 移除选择覆盖层selectionOverlay: null, //不移除会有一个默认的灰色背景颜色//DateTime.now().year获取当年年份//List.generate(126,(index)):生成指定长度的列表children: List.generate(DateTime.now().year - 1899, (index) {return Center(child: Text('${1900 + index}', //年滑动框显示的文本style: TextStyle(fontSize: 18),//文本的样式),);}),),// 上横线Positioned(top: 40, // 调整到合适位置left: 0,right: 0,child: Container(height: 1,color: Color(0xFFD8D8D8).withOpacity(0.6),),),Positioned(top: 48, // 调整到合适位置left: 70,// 调整到合适位置right: 0,child: Container(child: Text("年",style: TextStyle(color: Color(0xFF3D3D3D),fontSize: 20),),//color: Color(0xFFD8D8D8).withOpacity(0.6),),),// 下横线Positioned(bottom: 40, // 调整到合适位置left: 0,right: 0,child: Container(height: 1,color: Color(0xFFD8D8D8).withOpacity(0.6),),),],),),],),),// 月份选择Expanded(child: Column(children: [SizedBox(height: 120,child: Stack(children: [CupertinoPicker(itemExtent: 40,onSelectedItemChanged: (int index) {selectedMonth = index + 1;},// 移除选择覆盖层selectionOverlay: null,children: List.generate(12, (index) {return Center(child: Text('${index + 1}',//月滑动框显示的文本style: TextStyle(fontSize: 18),),);}),),Positioned(top: 40,left: 0,right: 0,child: Container(height: 1, color: Color(0xFFD8D8D8).withOpacity(0.6),),),Positioned(top: 48, // 调整到合适位置left: 60,right: 0,child: Container(child: Text("月",style: TextStyle(color: Color(0xFF3D3D3D),fontSize: 20),),//color: Color(0xFFD8D8D8).withOpacity(0.6),),),Positioned(bottom: 40,left: 0,right: 0,child: Container(height: 1, color: Color(0xFFD8D8D8).withOpacity(0.6),),),],),),],),),// 日期选择Expanded(child: Column(children: [SizedBox(height: 120,child: Stack(children: [CupertinoPicker(itemExtent: 40,onSelectedItemChanged: (int index) {selectedDay = index + 1;},// 移除选择覆盖层selectionOverlay: null,children: List.generate(31, (index) {return Center(child: Text('${index + 1}',//日滑动框显示的文本style: TextStyle(fontSize: 18),),);}),),Positioned(top: 40,left: 0,right: 0,child: Container(height: 1, color: Color(0xFFD8D8D8).withOpacity(0.6),),),Positioned(top: 48, // 调整到合适位置left: 60,right: 0,child: Container(child: Text("日",style: TextStyle(color: Color(0xFF3D3D3D),fontSize: 20),),//color: Color(0xFFD8D8D8).withOpacity(0.6),),),Positioned(bottom: 40,left: 0,right: 0,child: Container(height: 1, color: Color(0xFFD8D8D8).withOpacity(0.6),),),],),),],),),],),const SizedBox(height: 16),// 4.按钮的实现逻辑Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [TextButton(style: TextButton.styleFrom(backgroundColor: Color(0xFFD8D8D8),foregroundColor: Color(0xFF3D3D3D),minimumSize: Size(100, 40),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20),),),onPressed: () => Navigator.pop(context),child: Text("取消",style: TextStyle(fontSize: 16),),),TextButton(style: TextButton.styleFrom(backgroundColor: Color(0xFF1F8FFF),foregroundColor: Colors.white,minimumSize: Size(100, 40),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20),),),onPressed: () {//将年、月、日组合成标准格式的日期字符串(YYYY-MM-DD:eg:2000-01-01)//.padLeft(2,'0'):往左侧填充0.确保2位数字String formattedDate = "$selectedYear-${selectedMonth.toString().padLeft(2, '0')}-${selectedDay.toString().padLeft(2, '0')}";Navigator.pop(context);setState(() {_birthday = formattedDate;});widget.onBirthdayChanged(formattedDate); //通过回调函数,把新的日期传给主页},child: Text("确定",style: TextStyle(fontSize: 16),),),],),],),),);},);}

5.回到首页(home_page)获取回调的最新的生日的值,更新UI

                onBirthdayChanged: (newBirthday){ //5.接收子页面传过来的新生日日期,引发UI重建setState(() {_homeBirthday = newBirthday;});},

代码实例

home_page.dart

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:my_flutter/person_information_page.dart';class HomePage extends StatefulWidget {const HomePage({super.key});@overrideState<StatefulWidget> createState() => _HomePageState();
}class _HomePageState extends State<HomePage> {var _homeGender = "男"; //性别var _homeName = "西西没烦恼"; //昵称var _homeBirthday = "2000-01-01"; // 出生年月var _homeHeight = "183"; // 身高// =======================计算具体年龄的方法=================================int get _age {try {//将字符串格式的生日(如 "2000-01-01")转换为 DateTime对象final birthDate = DateTime.parse(_homeBirthday);final now = DateTime.now(); //获取当前日期时间int age = now.year - birthDate.year; //计算基础年龄(虚岁)if (now.month < birthDate.month || (now.month == birthDate.month && now.day < birthDate.day)) { //判断是否已过生日(实岁)age--;}return age;} catch (e) {return 23; // 默认年龄}}//构建UI@overrideWidget build(BuildContext context) {return Scaffold(body: Container(height: double.infinity,padding: const EdgeInsets.all(16),// 主页背景颜色decoration: const BoxDecoration(gradient: LinearGradient(//渐变begin: Alignment.topCenter,end: Alignment.centerRight,colors: [Color(0xFF62F4F4),Color(0xFFF6F7F9),],),),child: SingleChildScrollView( //可滚动的页面physics: const ClampingScrollPhysics(),child: Column(crossAxisAlignment: CrossAxisAlignment.start,children: [// 个人信息buildUserInfo(),const SizedBox(height: 25),],),),),);}//=======================个人信息的UI=====================================Widget buildUserInfo() {return Column(mainAxisAlignment: MainAxisAlignment.center,children: [const SizedBox(height: 96),// 头像:讲图片裁剪成圆形ClipOval(child: Image.asset("assets/images/apple.png",width: 90,height: 90,fit: BoxFit.cover,),),const SizedBox(height: 8),// 昵称Row(mainAxisAlignment: MainAxisAlignment.center,children: [GestureDetector(onTap: () {  //点击跳转个人信息详情页面//8.获取回调过来的昵称Navigator.push(context, MaterialPageRoute(builder: (context)=> PersonInformationPage(onNameChanged: (newName) {setState(() {_homeName = newName;//更新首页名字变量,引发UI重建});},onGenderChanged: (newGender){setState(() {_homeGender = newGender; //接收子页面传过来的新性别,引发UI重建});},onBirthdayChanged: (newBirthday){ //接收子页面传过来的新生日日期,引发UI重建setState(() {_homeBirthday = newBirthday;});},)));},child: Row(mainAxisAlignment: MainAxisAlignment.center,children: [Text(_homeName, // 名字style: TextStyle(color: const Color(0xFF3D3D3D),fontWeight: FontWeight.bold,fontSize: 24,),),const SizedBox(width: 10),Image.asset("assets/images/cherry.png",width: 20,height: 20,),],),),],),const SizedBox(height: 8),// 个人资料Row(mainAxisAlignment: MainAxisAlignment.center,children: [Text(_homeGender, //性别style: TextStyle(color: const Color(0xFF3D3D3D), fontSize: 16),),// 竖线分隔符Container(width: 1,height: 16,margin: const EdgeInsets.symmetric(horizontal: 12),color: const Color(0xFFD8D8D8),),Text("${_age}岁", // 年龄style: TextStyle(color: const Color(0xFF3D3D3D), fontSize: 16),),// 竖线分隔符Container(width: 1,height: 16,margin: const EdgeInsets.symmetric(horizontal: 12),color: const Color(0xFFD8D8D8),),Text(_homeHeight,//身高style: TextStyle(color: const Color(0xFF3D3D3D), fontSize: 16),),Text("cm",style: TextStyle(color: const Color(0xFF3D3D3D), fontSize: 16),),],),],);}}

personal_information_page.dart

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';class PersonInformationPage extends StatefulWidget {const PersonInformationPage({super.key,required this.onNameChanged,required this.onGenderChanged,required this.onBirthdayChanged,//2.添加必须传入的生日回调函数});final Function(String) onNameChanged;final Function(String) onGenderChanged;final Function(String) onBirthdayChanged;//1,添加回调函数@overrideState<StatefulWidget> createState() => _PersonInformationPageState();
}class _PersonInformationPageState extends State<PersonInformationPage> {var _selectedGender = "男";//性别var _name = "西西没烦恼"; //昵称var _birthday = "2025-10-01";//初始日期var _height = "183"; //身高final TextEditingController _nameController = TextEditingController();@overridevoid initState(){super.initState();_nameController.text = _name;}@overridevoid dispose(){_nameController.dispose();super.dispose();}// 构建UI@overrideWidget build(BuildContext context) {return Scaffold(body: Container(height: double.infinity,padding: const EdgeInsets.all(16),// 主页背景颜色decoration: const BoxDecoration(gradient: LinearGradient( //颜色渐变begin: Alignment.topCenter,end: Alignment.centerRight,colors: [Color(0xFF62F4F4),Color(0xFFF7F7F9),],),),child: SingleChildScrollView( //可滚动的页面child: Column(mainAxisAlignment: MainAxisAlignment.start,children: [const SizedBox(height: 96),// 头像:裁剪成圆形ClipOval(child: Image.asset("assets/images/apple.png",width: 90,height: 90,fit: BoxFit.cover,),),const SizedBox(height: 8),Row(mainAxisAlignment: MainAxisAlignment.center,children: [Text("点击更换头像",style: TextStyle(color: const Color(0xFF3D3D3D),fontWeight: FontWeight.bold,fontSize: 24,),),const SizedBox(width: 10),],),const SizedBox(height: 8),Text("点击可更换个人信息",style: TextStyle(color: const Color(0xFF3D3D3D).withOpacity(0.6),fontSize: 12,),),const SizedBox(height: 38),// 个人信息列表buildListInformation(),],),),),);}//===========================个人信息列表=======================================//Widget buildListInformation() {return Padding(padding: const EdgeInsets.only(top: 10),child: Container(padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 31),decoration: BoxDecoration(color: Colors.white,borderRadius: BorderRadius.circular(30),),child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [// 昵称GestureDetector(onTap: () {ChangeNameDialog();},child: Row(children: [Text("昵称",style: TextStyle(fontSize: 16, color: Color(0xFF3D3D3D)),),const Spacer(),Text(_name,style: TextStyle(color: Color(0xFF3D3D3D).withOpacity(0.6),fontSize: 14,),),const SizedBox(width: 6),Image.asset("assets/images/cherry.png",width: 30,height: 30,),],),),const SizedBox(height: 28),// 性别GestureDetector(onTap: () {changeGenderDialog();},child: Row(children: [Text("性别",style: TextStyle(fontSize: 16, color: Color(0xFF3D3D3D)),),const Spacer(),Text(_selectedGender, // 显示当前选中性别style: TextStyle(color: Color(0xFF3D3D3D).withOpacity(0.6),fontSize: 14,),),const SizedBox(width: 6),Image.asset("assets/images/cherry.png",width: 30,height: 30,),],),),const SizedBox(height: 28),// 生日GestureDetector(onTap: () {//3.设置修改生日的提示框changeBirthdayDialog();},child: Row(children: [Text("生日",style: TextStyle(fontSize: 16, color: Color(0xFF3D3D3D)),),const Spacer(),Text(_birthday,style: TextStyle(color: Color(0xFF3D3D3D).withOpacity(0.6),fontSize: 14,),),const SizedBox(width: 6),Image.asset("assets/images/cherry.png",width: 30,height: 30,),],),),const SizedBox(height: 28),// 身高GestureDetector(onTap: () {},child: Row(children: [Text("身高",style: TextStyle(fontSize: 16, color: Color(0xFF3D3D3D)),),const Spacer(),Text(_height,style: TextStyle(color: Color(0xFF3D3D3D).withOpacity(0.6),fontSize: 14,),),Text("cm",style: TextStyle(color: Color(0xFF3D3D3D).withOpacity(0.6),fontSize: 14,),),const SizedBox(width: 6),Image.asset("assets/images/cherry.png",width: 30,height: 30,),],),),],),),);}//========================修改名字的弹窗========================================//void ChangeNameDialog() {_nameController.text = _name; //设置当前名字到输入框showDialog(context: context,builder: (builder) {return Dialog(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(26),),child: Container(width: 263,padding: EdgeInsets.only(top: 20,bottom: 29,left: 34,right: 34),decoration: BoxDecoration(color: Colors.white, //背景颜色borderRadius: BorderRadius.circular(26),),child: Column(mainAxisSize: MainAxisSize.min,crossAxisAlignment: CrossAxisAlignment.start,children: [Row(mainAxisAlignment: MainAxisAlignment.center,children: [Text("修改昵称",style: const TextStyle(color: Colors.black,fontSize: 22,fontWeight: FontWeight.bold,),),],),SizedBox(height: 16),Container(padding: EdgeInsets.symmetric(horizontal: 12),decoration: BoxDecoration(color: Color(0xFFD8D8D8),//输入框颜色borderRadius: BorderRadius.circular(7),),child: TextField( //创建文本输入框组件controller: _nameController, //控制器:用于获取或者设置输入框文本内容style: TextStyle(color: Colors.white),decoration: InputDecoration(//hintText: "请输入",//提示性文字hintStyle: TextStyle(color: Colors.white54),border: InputBorder.none,),),),SizedBox(height: 20),Row(children: [//取消按钮Expanded(child: Container(height: 44, // 固定高度child: TextButton(onPressed: () => Navigator.pop(context),style: TextButton.styleFrom(backgroundColor: Color(0xFFD8D8D8),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(26),),),child: Text("取消",style: TextStyle(color: Color(0xFF3D3D3D), fontSize: 16),),),),),SizedBox(width: 50),//确定按钮Expanded(child: Container(height: 44, // 固定高度child: TextButton(onPressed: () {//确定按钮具体的实现逻辑if(_nameController.text.trim().isNotEmpty){ //检查输入框内容是否非空String newName = _nameController.text.trim(); //获取输入框的文本内容setState(() {_name = newName; //当前页面状态,触发界面重绘});widget.onNameChanged(newName); //调用回调函数通知首页(home_page)Navigator.pop(context);//关闭对话框}},style: TextButton.styleFrom(backgroundColor: Color(0xff1F8FFF),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(26),),),child: Text("确定",style: TextStyle(color: Colors.white, fontSize: 16),),),),),],)],),),);},).then((value) { //处理异步操作完成后的回调if(value != null && mounted) { //检查返回的结果不为空 && 检查当前组件是否还在挂载状态(避免在组件销毁后更新状态)Navigator.pop(context, value); //返回上一页并传递数据}});}//========================修改性别的弹窗========================================//void changeGenderDialog() {showDialog(context: context,builder: (context) {return Dialog(backgroundColor: Colors.white, //背景颜色shape: RoundedRectangleBorder( //形状配置borderRadius: BorderRadius.circular(26),),child: Container(width: 250, // 自定义宽度padding: EdgeInsets.all(16), // 内边距child: Column(mainAxisSize: MainAxisSize.min,children: [// 男性选项ListTile(dense: true, //紧凑模式title: Text("男", style: TextStyle(fontSize: 16, color: Color(0xFF3D3D3D))),trailing: _selectedGender == "男" //只有选中“男”,才显示男性行尾部图标(三元运算符)? Image.asset("assets/images/cherry.png", width: 24, height: 24): null,//点击事件onTap: () {Navigator.pop(context);//关闭对话框setState(() {_selectedGender = "男"; //更新性别变量值});widget.onGenderChanged("男");// 调用回调函数,传值回主页},),// 女性选项ListTile(dense: true,//紧凑模式title: Text("女", style: TextStyle(fontSize: 16, color: Color(0xFF3D3D3D))),trailing: _selectedGender == "女" //只有选中“女”,才显示女性行尾部图标? Image.asset("assets/images/cherry.png", width: 24, height: 24): null,onTap: () {Navigator.pop(context);setState(() {_selectedGender = "女";  //更新性别变量值});widget.onGenderChanged("女");// 调用回调函数,传值回主页},),],),),);},);}//构建选择生日的弹窗//==========================选择生日的弹窗=====================================//void changeBirthdayDialog() {//1.设定初始值int selectedYear = 1900; //从哪一年开始int selectedMonth = 1; //默认选中月份int selectedDay = 1; //默认选中日期//2.设置年的初始选中项为2000:意思就是往后滑动一百项,1900+100 = 2000final controllerYear = FixedExtentScrollController(initialItem: 100);showDialog(context: context,builder: (context) {return Dialog(backgroundColor: Colors.white,shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(26),),child: Container(width: 320,padding: const EdgeInsets.all(16),child: Column(mainAxisSize: MainAxisSize.min,children: [const SizedBox(height: 16),// 3.自定义年月日选择器Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [// 年份选择Expanded(child: Column(children: [SizedBox(height: 120,child: Stack(children: [CupertinoPicker(itemExtent: 40, //选中项的高度scrollController: controllerYear,//设置初始选中项的值(2000)onSelectedItemChanged: (int index) { //当选中项变化时触发,参数为索引selectedYear = 1900 + index; //存储用户选择的数据(将数组索引转换为实际的年份值)},// 移除选择覆盖层selectionOverlay: null, //不移除会有一个默认的灰色背景颜色//DateTime.now().year获取当年年份//List.generate(126,(index)):生成指定长度的列表children: List.generate(DateTime.now().year - 1899, (index) {return Center(child: Text('${1900 + index}', //年滑动框显示的文本style: TextStyle(fontSize: 18),//文本的样式),);}),),// 上横线Positioned(top: 40, // 调整到合适位置left: 0,right: 0,child: Container(height: 1,color: Color(0xFFD8D8D8).withOpacity(0.6),),),Positioned(top: 48, // 调整到合适位置left: 70,// 调整到合适位置right: 0,child: Container(child: Text("年",style: TextStyle(color: Color(0xFF3D3D3D),fontSize: 20),),//color: Color(0xFFD8D8D8).withOpacity(0.6),),),// 下横线Positioned(bottom: 40, // 调整到合适位置left: 0,right: 0,child: Container(height: 1,color: Color(0xFFD8D8D8).withOpacity(0.6),),),],),),],),),// 月份选择Expanded(child: Column(children: [SizedBox(height: 120,child: Stack(children: [CupertinoPicker(itemExtent: 40,onSelectedItemChanged: (int index) {selectedMonth = index + 1;},// 移除选择覆盖层selectionOverlay: null,children: List.generate(12, (index) {return Center(child: Text('${index + 1}',//月滑动框显示的文本style: TextStyle(fontSize: 18),),);}),),Positioned(top: 40,left: 0,right: 0,child: Container(height: 1, color: Color(0xFFD8D8D8).withOpacity(0.6),),),Positioned(top: 48, // 调整到合适位置left: 60,right: 0,child: Container(child: Text("月",style: TextStyle(color: Color(0xFF3D3D3D),fontSize: 20),),//color: Color(0xFFD8D8D8).withOpacity(0.6),),),Positioned(bottom: 40,left: 0,right: 0,child: Container(height: 1, color: Color(0xFFD8D8D8).withOpacity(0.6),),),],),),],),),// 日期选择Expanded(child: Column(children: [SizedBox(height: 120,child: Stack(children: [CupertinoPicker(itemExtent: 40,onSelectedItemChanged: (int index) {selectedDay = index + 1;},// 移除选择覆盖层selectionOverlay: null,children: List.generate(31, (index) {return Center(child: Text('${index + 1}',//日滑动框显示的文本style: TextStyle(fontSize: 18),),);}),),Positioned(top: 40,left: 0,right: 0,child: Container(height: 1, color: Color(0xFFD8D8D8).withOpacity(0.6),),),Positioned(top: 48, // 调整到合适位置left: 60,right: 0,child: Container(child: Text("日",style: TextStyle(color: Color(0xFF3D3D3D),fontSize: 20),),//color: Color(0xFFD8D8D8).withOpacity(0.6),),),Positioned(bottom: 40,left: 0,right: 0,child: Container(height: 1, color: Color(0xFFD8D8D8).withOpacity(0.6),),),],),),],),),],),const SizedBox(height: 16),// 4.按钮的实现逻辑Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [TextButton(style: TextButton.styleFrom(backgroundColor: Color(0xFFD8D8D8),foregroundColor: Color(0xFF3D3D3D),minimumSize: Size(100, 40),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20),),),onPressed: () => Navigator.pop(context),child: Text("取消",style: TextStyle(fontSize: 16),),),TextButton(style: TextButton.styleFrom(backgroundColor: Color(0xFF1F8FFF),foregroundColor: Colors.white,minimumSize: Size(100, 40),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20),),),onPressed: () {//将年、月、日组合成标准格式的日期字符串(YYYY-MM-DD:eg:2000-01-01)//.padLeft(2,'0'):往左侧填充0.确保2位数字String formattedDate = "$selectedYear-${selectedMonth.toString().padLeft(2, '0')}-${selectedDay.toString().padLeft(2, '0')}";Navigator.pop(context);setState(() {_birthday = formattedDate;});widget.onBirthdayChanged(formattedDate); //通过回调函数,把新的日期传给主页},child: Text("确定",style: TextStyle(fontSize: 16),),),],),],),),);},);}}

http://www.dtcms.com/a/549576.html

相关文章:

  • 不止于加热:管式炉在材料科学与新能源研发中的关键作用
  • 深圳网站建设方案优化深圳发布广告的平台有哪些
  • Go语言中json.RawMessage
  • Pytorch常用函数学习摘录
  • 个人什么取消网站备案铭万做的网站怎么样
  • 2025-10-30 ZYZOJ Star(斯达)模拟赛 hetao1733837的record
  • 百胜中台×OceanBase:打造品牌零售降本增效的数字核心引擎,热门服饰、美妆客户已实践
  • 深度学习调试工具链:从PyTorch Profiler到TensorBoard可视化
  • 不可变借用的规则与限制: 从只读语义到零拷贝架构的 5 000 字深潜
  • 专题三 之 【二分查找】
  • C++进阶: override和final说明符-----继承2中重写的确认官和刹车(制动器)
  • 数据科学每日总结--Day7--数据库
  • opencv 学习: 01 ubuntu20.04 下 opencv 4.12.0 源码编译
  • 满足“国六”标准的通用型故障诊断仪:Q-OBD
  • 上海专业建站公湖南网站建设设计
  • 智慧时空大数据平台:释放时空信息数据价值
  • 线程基本概念
  • MySQL MDL锁阻塞DDL 导致复制线程卡住
  • 智慧管理,赋能美容院新未来
  • Flink做checkpoint迟迟过不去的临时解决思路
  • 网站注册 优帮云wordpress首页静态化
  • [人工智能-大模型-115]:模型层 - 用通俗易懂的语言,阐述神经网络为啥需要多层
  • Actix Web 不是 Nginx:解析 Rust 应用服务器与传统 Web 服务器的本质区别
  • pdf文件上传下载记录
  • 辽阳网站设计中国建设银行的网站.
  • 2. WPF程序打包成一个单独的exe文件
  • 东软专业力考试--Java Web 开发基础
  • 8方向控制圆盘View
  • js中Map和对象{}的区别
  • 基于python构建的低温胁迫实验