Flutter - CupertinoDatePicker initialDateTime 只更新一次

Flutter - CupertinoDatePicker initialDateTime updates only once

我创建了一个 CupertinoDatePicker 小部件,初始值设置为一个变量。

我想在用户单击屏幕中的另一个小部件时将选择器中的选定值更新为该变量值 - 但它不起作用(尽管 CupertinoDatePicker 小部件已重建)。

是bug还是我做错了什么?

代码(可以复制粘贴到dartPad):

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

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
final _time = DateTime.now();
int _min = 5;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {
  @override
  createState() => MyWidgetSate();
}

class MyWidgetSate extends State<MyWidget> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('_min = ' + _min.toString(), style: Theme.of(context).textTheme.headline4),
        _buildDurationPicker(context),
        RaisedButton(
            onPressed: () {
              print('hello');
              setState(() {
                _min += 5;
              });
            },
            child: const Text('Add', style: TextStyle(fontSize: 20)),
          ),
        ],
    );
  }
}

Widget _buildDurationPicker(BuildContext context) {
    DateTime initDateTime = DateTime(_time.year, _time.month, _time.day)
        .add(Duration(minutes: _min));
    return Container(
      height: 216.0,
      color: Colors.white,
      child: CupertinoDatePicker(
        mode: CupertinoDatePickerMode.time,
        use24hFormat: true,
        initialDateTime: initDateTime,
        backgroundColor: Colors.transparent,
        onDateTimeChanged: (DateTime date) {
          //
        },
      ),
    );
  }

CupertinoDatePicker 正在内部维护状态并且仅在其 initState 上设置 initialDateTime,尽管您更新了小部件的状态。

要在每次设置 initialDateTime 时强制重建,请将 UniqueKey() 指定为 CupertinoDatePickerkey ,它会在每次状态更改时重建有了新的 initDateTime.

(...)
  CupertinoDatePicker(
        key: UniqueKey(),
        mode: CupertinoDatePickerMode.time,
        use24hFormat: true,
        initialDateTime: initDateTime,
        backgroundColor: Colors.transparent,
        onDateTimeChanged: (DateTime date) {
          //
        },
      ),