该代码是一个按钮,按下它将显示一个模式底表(带有showModalBottomSheet()),其中带有可滚动的月份列表,用户可以使用ListWheelScrollView小部件(带有方法use.Delegate) Select 月份.

当滚轮滚动时,我遇到了状态没有更新的问题,所以我试图打印它.打印(在代码中可用)显示状态正在更新,但真的很奇怪.我使用Riverpod作为状态管理解决方案,但我不介意使用有状态窗口小部件,所以如果对您来说更容易,请不要犹豫.

我试图在控制台中打印运行的多个时刻的状态,但我无法理解它遵循的逻辑.

如果你能找到一种方法来更新状态,或者如果你知道一些可以帮助我的事情,那就太棒了,你可以和我分享它.

我试着把我的问题尽量缩小,这样你就可以很容易地找到问题的核心.它是这样的:

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

const List<String> _months = <String>[
  'January',
  'February',
  'March',
  'April',
  'May',
  'June',
  'July',
  'August',
  'September',
  'October',
  'November',
  'December'
];

void main() => runApp(ProviderScope(child: MyApp()));

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MainPage(),
    );
  }
}

int monthIndex = (DateTime.now().month);
final monthIndexProvider = StateProvider(((ref) => monthIndex));

class MainPage extends ConsumerWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final int month = ref.watch(monthIndexProvider);

    return Scaffold(
      body: Center(
        child: ElevatedButton(
            child: Text(month.toString()),
            onPressed: () async {
              await showModalBottomSheet(
                context: context,
                builder: (BuildContext context) {
                  return Container(
                      height: 300,
                      child: ListWheelScrollView.useDelegate(
                          itemExtent: 50,
                          perspective: 0.001,
                          diameterRatio: 1.6,
                          physics: FixedExtentScrollPhysics(),
                          squeeze: 1.0,
                          overAndUnderCenterOpacity: 0.2,
                          useMagnifier: true,
                          magnification: 1.3,
                          onSelectedItemChanged: (index) {
                            ref.read(monthIndexProvider.notifier).state = index;
                            print(month); // This is the print where I want to get the state of month but it isn't the right one.
                          },
                          childDelegate: ListWheelChildBuilderDelegate(
                              childCount: 12,
                              builder: (context, index) {
                                return Container(
                                  child: Text(_months[index]),
                                );
                              })));
                },
              );
            }),
      ),
    );
  }
}

推荐答案

未更新showModalBottomSheet的内部状态.您可以使用StatefulBuilder进行更新.更多信息here.

以下是完整的解决方案:

final monthIndex = (DateTime.now().month);
final monthIndexProvider = StateProvider(((ref) => monthIndex));

class MainPage extends ConsumerWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          child: Text(ref.watch(monthIndexProvider).toString()),
          onPressed: () async {
            await showModalBottomSheet(
              context: context,
              builder: (BuildContext context) {
                return StatefulBuilder(
                  builder: (BuildContext context, StateSetter setStateModal) {
                    final int month = ref.watch(monthIndexProvider);
                    return SizedBox(
                      height: 300,
                      child: ListWheelScrollView.useDelegate(
                        itemExtent: 50,
                        perspective: 0.001,
                        diameterRatio: 1.6,
                        physics: const FixedExtentScrollPhysics(),
                        squeeze: 1.0,
                        overAndUnderCenterOpacity: 0.2,
                        useMagnifier: true,
                        magnification: 1.3,
                        onSelectedItemChanged: (index) {
                          ref.read(monthIndexProvider.notifier).state = index;
                          setStateModal(() {});
                          print(month);
                        },
                        childDelegate: ListWheelChildBuilderDelegate(
                          childCount: 12,
                          builder: (context, index) {
                            return Text(_months[index]);
                          },
                        ),
                      ),
                    );
                  },
                );
              },
            );
          },
        ),
      ),
    );
  }
}

Flutter相关问答推荐

如何在容器中移动图标按钮?

在Flutter中创建具有固定行的压缩水平列表

如何从模型列表中生成DropdownButtonFormField?

关闭模式,但再次打开时微件条件相同

缩短经常使用的行Theme.of(context).colorScheme

BoxConstraints强制使用无限宽度(列中的Listview)

与FTPS连接时出现Flutter FTPConnect HandshakeException错误

Flutter - Stripe:类型List 不是类型Map 的子类型? method_channel_stripe.dart 中的错误:263

如何给按钮的边框半径?

无状态和有状态小部件,我可以同时使用吗?

ListView 后台可见

Flutter 自定义对齐

在 flutter 中获取最喜欢的文档

为什么 appBar 小部件在 flutter 中不是常量

如何将 chrome web 模拟器添加到 vs code

如何在 Flutter 中将 ScaffoldMessenger 中的 Snackbar 显示为 Widget?

如何按值对列表中的 map 进行排序

Flutter Widget 测试:无法使用 find.byWidget() 找到小部件

构建失败 - 无法解析 io.grpc:grpc-core:[1.28.0]. (是的,我已经升级到 mavenCentral())

我想将我的模型类对象发送到下一个屏幕之前我这样做首先我在第二个屏幕中声明对象