该代码是一个按钮,按下它将显示一个模式底表(带有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]),
);
})));
},
);
}),
),
);
}
}