Flutter - CupertinoDatePicker initialDateTime обновляется только один раз - PullRequest
2 голосов
/ 10 июля 2020

Я создал виджет CupertinoDatePicker с начальным значением, установленным для переменной.

Я хочу обновить выбранное значение в средстве выбора до этого значения переменной, когда пользователь щелкает другой виджет в экран - но он не работает (хотя виджет CupertinoDatePicker перестраивается).

Это ошибка или я что-то делаю не так?

Код (можно скопировать и вставить в 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) {
          //
        },
      ),
    );
  }

1 Ответ

3 голосов
/ 10 июля 2020

CupertinoDatePicker поддерживает состояние внутри и устанавливает только initialDateTime на его initState, несмотря на то, что вы обновляете состояние своего виджета.

Чтобы принудительно перестраивать каждый раз, когда вы устанавливаете свой initialDateTime, назначьте UniqueKey() как key вашего CupertinoDatePicker, и он будет перестраиваться каждый раз, когда ваше состояние изменится с новым initDateTime.

(...)
  CupertinoDatePicker(
        key: UniqueKey(),
        mode: CupertinoDatePickerMode.time,
        use24hFormat: true,
        initialDateTime: initDateTime,
        backgroundColor: Colors.transparent,
        onDateTimeChanged: (DateTime date) {
          //
        },
      ),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...