【问题标题】:Flutter Format Time of Day from time picker来自时间选择器的 Flutter Format Time of Day
【发布时间】:2019-09-25 21:59:07
【问题描述】:

我正在尝试从我的颤振应用程序中的时间选择器中格式化所选时间。我不知道为什么,但事实证明这比它应该的更困难。我试图达到的最终结果是小时:小步舞曲或下午 5:00。在用户从时间选择器小部件中选择时间后,这将显示在一个盒子容器中。我有一个名为 'timeFormater()' 的方法,它将格式化选择的时间,但是当我运行我的代码。格式化TimeOfDay()是否有更简单的方法/方法?

我的代码:

      import 'package:flutter/material.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:intl/intl.dart';
    import 'package:auto_size_text/auto_size_text.dart';
    import 'dart:io' show Platform;

    class DateTimePicker extends StatefulWidget {
      @override
      _DateTimePickerState createState() => _DateTimePickerState();
    }

    class _DateTimePickerState extends State<DateTimePicker> {
      DateTime _date = new DateTime.now();
      TimeOfDay _time = new TimeOfDay.now();
      Duration initialtimer = new Duration();
      DateTime _datePicked;
      TimeOfDay _timePicked;


      @override
      void initState() {
       // timeController.addListener(_time);

      }

      @override
      Widget build(BuildContext context) {
        return Container(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              Row(
                mainAxisAlignment: MainAxisAlignment.start,
                // mainAxisSize: MainAxisSize.min,
                children: <Widget>[
                  dateContainer(),
                  timeContainer()
                ],
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.start,
                children: <Widget>[
                  customDatePicker(context),
                  customTimePicker(context)
                ],
              ),
            ],
          ),
        );
      }
 Widget customTimePicker(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.only(left: 12.0),
      child: FlatButton(
          child: Text('Time', style: TextStyle(
              color: Colors.white
          ),),
          color: Colors.deepOrange,
          onPressed: () => _selectedTime(context)
      ),
    );
  }
 Future<Null> _selectedTime(BuildContext context) async {
    _timePicked = await showTimePicker(
        context: context,
        initialTime: _time);

    if (_timePicked != null) {
      setState(() {
        _time = _timePicked;
      });
    }
  }
 Widget timeContainer() {
    return Container(
      width: 100,
      height: 100,
      child: Padding(
          padding: const EdgeInsets.only(left: 16.0, top: 16.0,bottom: 16.0),
          child: Container(
            decoration: BoxDecoration(
              border: Border.all(
                width: .5,
                color: Colors.black
              )
            ),
            child: timeFormater(),
          )
      ),
    );
  }

  Widget timeFormater() {
    return Column(
      children: <Widget>[
        SizedBox(
          height: 20.0,
        ),
        _timePicked != null
            ? TimeOfDay(hour: _timePicked.hour, minute: _timePicked.minute)
            : SizedBox(
          width: 0.0,
          height: 0.0,
        ),
      ],
    );
  }
}

错误信息:

flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
flutter: The following assertion was thrown building DateTimePicker(dirty, dependencies: [_InheritedTheme,
flutter: _LocalizationsScope-[GlobalKey#6c45d]], state: _DateTimePickerState#7eeb8):
flutter: type 'TimeOfDay' is not a subtype of type 'Widget'
flutter:
flutter: Either the assertion indicates an error in the framework itself, or we should provide substantially
flutter: more information in this error message to help you determine and fix the underlying cause.
flutter: In either case, please report this assertion by filing a bug on GitHub:
flutter:   https://github.com/flutter/flutter/issues/new?template=BUG.md
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      _DateTimePickerState.timeFormater (package:rallie_app/utils/custom_date_timer.dart:176:13)
flutter: #1      _DateTimePickerState.timeContainer (package:rallie_app/utils/custom_date_timer.dart:163:20)
flutter: #2      _DateTimePickerState.build (package:rallie_app/utils/custom_date_timer.dart:37:15)
flutter: #3      StatefulElement.build (package:flutter/src/widgets/framework.dart:3830:27)
flutter: #4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3741:15)
flutter: #5      Element.rebuild (package:flutter/src/widgets/framework.dart:3564:5)
flutter: #6      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2277:33)
flutter: #7      _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:700:20)
flutter: #8      _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:275:5)
flutter: #9      _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15)
flutter: #10     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930:9)
flutter: #11     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842:5)
flutter: #15     _invoke (dart:ui/hooks.dart:209:10)
flutter: #16     _drawFrame (dart:ui/hooks.dart:168:3)
flutter: (elided 3 frames from package dart:async)

【问题讨论】:

  • TimeOfDay 不是 WidgetTextContainerSizedBox 等 - 你必须从你的 timeFormater() 方法返回一个 Widget
  • 有没有办法格式化 TimeOfDay 以显示小时:分钟?即使我将它添加到文本小部件中,如果我无法正确显示它仍然无法解决我的问题
  • 如果你想格式化TimeOfDay使用format()方法
  • 您能否添加更多说明,例如有效的代码示例。我尝试使用 TimeOfDayFormat.H_colon_mn 方法,但它没有格式化从时间选择器中选择的时间

标签: flutter widget timeofday


【解决方案1】:

从日期选择器中选择日期。

DateTime pickedDate;

@override
void initState() {
super.initState();
pickedDate = DateTime.now();
currentTime = "${pickedDate}";
time = TimeOfDay.now();
}

Container(
   width: width/2.3,
   child: InkWell(
   onTap: () {
   _pickDate();
   },
   child: IgnorePointer(
   child: AppTextField(
   text: "${pickedDate.day}/${pickedDate.month}/${pickedDate.year}",
   suffixIcon: Icon(Icons.calendar_today),
   onTextChnage: null,
   ),
   ),
   ),
   ),

选择日期的方法

 _pickDate() async{
DateTime date = await showDatePicker(
    context: context,
    initialDate: pickedDate,
    firstDate: DateTime(DateTime.now().year-10),
    lastDate: DateTime(DateTime.now().year+10)
);
debugPrint("${pickedDate} ${time}");
//debugPrint(date as String);
if(date != null){
  setState(() {
    pickedDate = date;
  });
}}

【讨论】:

    【解决方案2】:

    这将为您正确格式化 TimeOfDay:

    final localizations = MaterialLocalizations.of(context);
    final formattedTimeOfDay = localizations.formatTimeOfDay(timeOfDay);
    

    【讨论】:

    • 这似乎是获取字符串输出的正确方法。这应该是一个公认的答案。
    • 这是一个不错的解决方案,但依赖于上下文,不适合在不可用的地方使用。
    • @funder7 如果您使用像 GetX 这样的 StateManagement,您可以简单地在包装上述代码的字符串返回类型方法中使用 Get.context。
    • @Akradhi 我不知道 GetX 抱歉。我的意思是,如果解决方案依赖于 context,那么它在 context 不可用的情况下将无法使用。这只是需要考虑的事情,但不一定是阻止程序!我想说,如果您需要正确格式化TimeOfDay,那么必须要有可用的上下文。但老实说,我已经离开 Flutter 大约 6 个月了,其他人肯定会比我准备得更充分:-)
    • @funder7 你可以看看这个框架。我提供了下面的链接。 pub.dev/packages/get 这真的很容易实现,在此之后我们不必太担心上下文。
    【解决方案3】:
      String timeValue ='Select Time';
      TimeOfDay selectedTime =TimeOfDay.now();
    
      Future<Null> _selectTime(BuildContext context) async {
      final TimeOfDay picked_s = await showTimePicker(
        context: context,
        initialTime: selectedTime, builder: (BuildContext context, Widget 
      child) {
           return MediaQuery(
             data: 
           MediaQuery.of(context).copyWith(alwaysUse24HourFormat:false),
            child: child,
          );});
    
    if (picked_s != null && picked_s != selectedTime )
      setState(() {
        selectedTime = picked_s;
        timeValue = picked_s.format(context);   //time convert into string formate
      });}
    

    【讨论】:

      【解决方案4】:

      字符串时间 = _timePicked.format(context);

      【讨论】:

      • 非常简单的解决方案! +1。只是想知道如何使用此解决方案指定显示格式(上午/下午 12 小时与 24 小时),与来自@bwhite 的解决方案相比。
      • @Fabrice 试试这个。这专门针对您的情况: import 'package:flutter/material.dart'; String formatTime({BuildContext context, TimeOfDay timeOfDay, bool alwaysUse24HourFormat = false}) { final localizations = MaterialLocalizations.of(context);最终 formattedTimeOfDay = 本地化.formatTimeOfDay(timeOfDay, alwaysUse24HourFormat: alwaysUse24HourFormat);返回格式化的TimeOfDay; }
      【解决方案5】:

      这就是我使用 Date Time 和 TimeOfDay 在 Flutter 平台上同时将它们的值分开的方式。

      static DateTime _eventdDate = DateTime.now();
      
      static var now =
        TimeOfDay.fromDateTime(DateTime.parse(_eventdDate.toString()));
      
      
      
       String _eventTime = now.toString().substring(10, 15);
      
      
      
      Future _pickTime() async {
      TimeOfDay timepick = await showTimePicker(
          context: context, initialTime: new TimeOfDay.now());
      
      if (timepick != null) {
        setState(() {
          _eventTime = timepick.toString().substring(10, 15);
        });
      } }
      
      Future _pickDate() async {
      
      DateTime datepick = await showDatePicker(
          context: context,
          initialDate: new DateTime.now(),
          firstDate: new DateTime.now().add(Duration(days: -365)),
          lastDate: new DateTime.now().add(Duration(days: 365)));
      
      if (datepick != null) {
        setState(() {
          _eventdDate = datepick;
        });
      } }
      

      【讨论】:

        【解决方案6】:

        这个问题与 TimeOfDay 无关——您只是尝试将值用作小部件。在你的代码中改变这个

         _timePicked != null
                ? TimeOfDay(hour: _timePicked.hour, minute: _timePicked.minute)
        

        _timePicked != null
                ? Text(TimeOfDay(hour: _timePicked.hour, minute: _timePicked.minute)
                    .toString())
        

        它会起作用的。

        【讨论】:

          【解决方案7】:

          你可以使用 DatePicker.showTimePicker

              DatePicker.showTimePicker(context,  
                      showTitleActions: true,  
                          onChanged: (date) {  
                           print('change $date');  
                      }, onConfirm: (date) {  
                           print('confirm $date');  
                      }, currentTime: DateTime.now(), locale: LocaleType.pt);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-21
            • 2019-03-02
            • 2020-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多