Flutter问题:ListWheelScrollView下StatefulWidget无法更新按钮显示月份
问题分析与解决方案
核心问题
你的代码存在两个关键问题导致按钮无法显示选中的月份:
- ElevatedButton的Text内容为空:你直接写了
Text(''),没有绑定需要展示的currentState变量。 - currentState初始化索引错误:
DateTime.now().month返回1-12的数值,直接作为列表索引会导致初始月份显示错误(列表索引范围是0-11)。
修正后的完整代码
import 'package:flutter/material.dart'; import 'year_month_picker/states_month.dart'; import 'year_month_picker/widgets/wheeltile.dart'; class MyMonthPickerr extends StatefulWidget { const MyMonthPickerr({Key? key}) : super(key: key); @override _MyMonthPickerrState createState() => _MyMonthPickerrState(); } class _MyMonthPickerrState extends State<MyMonthPickerr> { List<States_Month> states_month = []; // 修正索引:month减1,匹配列表0-11的索引范围 String currentState = [ 'January', 'February', 'March', 'April', "May", "June", "July", 'August', "September", "October", 'November', 'December' ][DateTime.now().month - 1]; @override void initState() { super.initState(); states_month = allStates(); } @override Widget build(BuildContext context) { return Center( child: ElevatedButton( // 绑定currentState,让按钮实时显示选中月份 child: Text(currentState), onPressed: () => showModalBottomSheet( context: context, builder: (BuildContext context) { // 同步初始选中索引,避免模态框和按钮状态错位 int selectedIndex = states_month.indexWhere((state) => state.names == currentState); return Container( color: Colors.blueGrey.shade800, child: ListWheelScrollView.useDelegate( itemExtent: 50, controller: FixedExtentScrollController( initialItem: selectedIndex, ), perspective: 0.001, diameterRatio: 1.6, physics: FixedExtentScrollPhysics(), squeeze: 1.0, overAndUnderCenterOpacity: 0.2, useMagnifier: true, magnification: 1.3, onSelectedItemChanged: (index) { setState(() { currentState = states_month[index].names!; }); }, childDelegate: ListWheelChildBuilderDelegate( childCount: states_month.length, builder: (context, index) { return WheelTile( currentState == states_month[index].names ? Colors.white : Colors.white60, states_month[index].names!, ); }, ), ), ); }, ), ), ); } }
额外优化说明
- 模态框初始化时,通过
indexWhere获取当前currentState对应的索引,确保滚动轮初始位置和按钮显示的月份完全一致。 - 移除了冗余的括号和类型转换(
((DateTime.now().month)).toInt()),DateTime.now().month本身就是int类型,无需额外转换。
内容的提问来源于stack exchange,提问作者Mathieu
相关产品推荐
相关产品推荐

