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

Flutter问题:ListWheelScrollView下StatefulWidget无法更新按钮显示月份

问题分析与解决方案

核心问题

你的代码存在两个关键问题导致按钮无法显示选中的月份:

  1. ElevatedButton的Text内容为空:你直接写了Text(''),没有绑定需要展示的currentState变量。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:40:36