微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不可为空的实例字段 '_selectedDate' 必须被初始化

如何解决不可为空的实例字段 '_selectedDate' 必须被初始化

我正在 Flutter 中开发一个费用管理应用程序,在这里我尝试使用 showDatePicker() 创建一个 DateTimePicker。因此在我的 presentDateTimePicker() 函数中,我正在调用 showDatePicker() 方法

我正在为 selectedDate 创建一个变量,我没有将它初始化为当前值,因为它会根据用户输入而改变。

在我的 setState() 方法中,我使用了 _selectedDate = pickedDate

仍然显示“不可为空的实例字段”的错误

我的小部件

//Flutter imports
import 'package:Flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:intl/intl.dart';

class NewTransaction extends StatefulWidget {
  final Function addTx;

  NewTransaction(this.addTx);

  @override
  _NewTransactionState createState() => _NewTransactionState();
}

class _NewTransactionState extends State<NewTransaction> {
  final _titleController = TextEditingController();
  final _amountController = TextEditingController();
  final _brandNameControlller = TextEditingController();
  DateTime _selectedDate;

  void _submitData() {
    final enteredTitle = _titleController.text;
    final enteredamount = double.parse(_amountController.text);
    final enteredBrandName = _brandNameControlller.text;

    if (enteredTitle.isEmpty || enteredamount <= 0) {
      return;
    }

    widget.addTx(
      enteredTitle,enteredamount,enteredBrandName,);
    Navigator.of(context).pop();
  }

  void _presentDateTimePicker() {
    showDatePicker(
      context: context,initialDate: DateTime.Now(),firstDate: DateTime(2019),lastDate: DateTime.Now(),).then((pickedDate) {
      if (pickedDate == null) {
        return;
      }
      setState(() {
        _selectedDate = pickedDate;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 5,child: Container(
        padding: EdgeInsets.all(10),child: Column(
          children: <Widget>[
            TextField(
              autocorrect: true,decoration: Inputdecoration(labelText: 'Title'),controller: _titleController,onSubmitted: (_) => _submitData,//onChanged: (val) {
              //titleInput = val;
              //},),TextField(
              autocorrect: true,decoration: Inputdecoration(labelText: 'Amount'),controller: _amountController,keyboardType: TextInputType.number,//onChanged: (val) => amountInput = val,decoration: Inputdecoration(labelText: 'Brand Name'),controller: _brandNameControlller,//onChanged: (val) => brandInput = val,Container(
              height: 70,child: Row(
                children: <Widget>[
                  Text(_selectedDate == null
                      ? 'No Date Chosen'
                      : 'Picked Date: ${DateFormat.yMd().format(_selectedDate)}'),FlatButton(
                    onpressed: _presentDateTimePicker,child: Text(
                      'Chose Date',style: TextStyle(fontWeight: FontWeight.bold),textColor: Theme.of(context).primaryColor,],RaisedButton(
              onpressed: _submitData,child: Text('Add Transaction'),color: Theme.of(context).primaryColor,textColor: Theme.of(context).textTheme.button!.color,);
  }
}

解决方法

如果你要改变setState方法中的值,你可以用

初始化变量
DateTime _selectedDate = DateTime.now();

并将其格式化为您向用户显示的格式,这将消除错误,如果您要在每次用户选择日期时更改它,将当前日期视为起始值会给用户一个开始点作为参考。

,

如果该值可以为空,只需将变量标记为 DateTime? _selectedDate;

无论何时使用它,只需先检查 null:


Text(_selectedDate == null
? 'No Date Chosen'
: 'Picked Date: ${DateFormat.yMd().format(_selectedDate!)}'),// Here you do know that the value can't be null so you assert to the compiler that

查看有关 null 安全性的 official docs,它们的质量非常高且具有指导意义。 您可以在那里了解何时使用可为空的 ? 不可空变量或 late 变量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。