文字未显示我要发送给它的变量

问题描述

我正在尝试开发一个小型应用程序以学习Dart和Flutter。 现在,我有一个带有图标的视图。当我单击此图标时,会出现一个带有日期选择器的警报框。 我选择一个日期,然后单击“确定”按钮后,应该回到上一个视图。 在第一个视图上,我有一个文本小部件。这个应该显示先前选择的日期。 我的问题是“文本”小部件无法显示正确的日期。我试图将setState添加到文本窗口小部件,但出现错误

请参阅下面的代码源。 非常感谢。


import 'package:Flutter/cupertino.dart';
import 'package:Flutter/material.dart';
import 'cupertino DatePicker.dart';
import 'package:intl/intl.dart';

var myselectedDate;

class AddProject extends StatefulWidget {

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

class _AddProjectState extends State<AddProject> {
  final GlobalKey<FormState> _formState = GlobalKey<FormState>();

var gender;

  @override
  Widget build(BuildContext context) {

    String projectName = "";
    return Scaffold(
      appBar: AppBar(
        title: Text(
          "Add Project",),actions: <Widget>[
        Padding(
          padding: EdgeInsets.only(right: 20.0),child: GestureDetector(
              onTap: () {},child: Icon(
                Icons.save,size: 26.0,)
        ),]
    ),floatingActionButton: FloatingActionButton(

          child: Icon(
            Icons.send,color: Colors.white,onpressed: () {
            //if (_formState.currentState.validate()) {
            //  _formState.currentState.save();

            //  Navigator.pop(context,true);
            }
          //}
            ),body: ListView(
        children: <Widget>[
          Form(
            child: Column(
              children: [

                //Field : Type project Name
                Padding(
                  padding: const EdgeInsets.fromLTRB(8.0,8.0,1.0),child: TextFormField(

                    decoration: Inputdecoration(hintText: "Project Name"),maxLength: 200,maxLines: 2,validator: (value) {
                      return value.isEmpty ? "Project name cannot be empty" : null;
                    },onSaved: (value) {
                      projectName = value;
                    },//Start Date text
                Container(
                    alignment: Alignment.topLeft,child: Padding(
                      padding: const EdgeInsets.fromLTRB(8.0,18.0,child: Text("Start Date",style: TextStyle(color: Colors.black87),)

                ),Row(
                  mainAxisAlignment: MainAxisAlignment.start,children: [
                    Padding(
                      padding: const EdgeInsets.fromLTRB(1.0,5.0,10.0),child: IconButton(
                        splashColor: Colors.lightGreenAccent,icon: Icon(Icons.calendar_today),//Image.asset('assets/icons/tag.png',//height: 30.0,//=============================

                        onpressed: () {
                          showDialog(
                            context: context,builder: (BuildContext context) {
                              return StatefulBuilder(
                                  builder: (context,setState){
                                    return AlertDialog(
                                      title: Text('Choose Date'),content: DatePickerDemo(),actions: <Widget>[
                                        FlatButton(
                                            child: Text("Cancel",style: TextStyle(
                                                  color: Colors.grey,)),onpressed: () {
                                              //selectedContext=false;
                                              Navigator.of(context).pop();
                                            },shape: new RoundedRectangleBorder(borderRadius: new BorderRadius.circular(30.0))

                                        ),FlatButton(
                                          child: Text("OK",style: TextStyle(
                                                color: Colors.blue,onpressed: () {

                                            myselectedDate=  DateFormat('dd MMMM,yyyy').format(selectedDate);


                                             print  ('test=' + myselectedDate.toString());

                                            Navigator.of(context).pop();
                                          },],);
                                  });
                            },);
                        }

                      //=============================
                    ),Text('test=' + myselectedDate.toString()),},key: _formState,);
  }


}

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

import '09_project_add.dart';

//var mySelectedDate = selectedDate;
DateTime selectedDate = DateTime.Now();

class DatePickerDemo extends StatefulWidget {
  @override
  _DatePickerDemoState createState() => _DatePickerDemoState();
}

class _DatePickerDemoState extends State<DatePickerDemo> {
  /// Which holds the selected date
  /// Defaults to today's date.


  /// This decides which day will be enabled
  /// This will be called every time while displaying day in calender.
  bool _decideWhichDayToEnable(DateTime day) {
    if ((day.isAfter(DateTime.Now().subtract(Duration(days: 1))) &&
        day.isBefore(DateTime.Now().add(Duration(days: 10))))) {
      return true;
    }
    return false;
  }

  _selectDate(BuildContext context) {
    final ThemeData theme = Theme.of(context);
    assert(theme.platform != null);
    switch (theme.platform) {
      case TargetPlatform.android:
      case TargetPlatform.fuchsia:
      case TargetPlatform.linux:
      case TargetPlatform.windows:
        return buildMaterialDatePicker(context);
      case TargetPlatform.iOS:
      case TargetPlatform.macOS:
        return buildCupertinoDatePicker(context);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,children: <Widget>[
            Text(
              "${selectedDate.toLocal()}".split('/')[0],style: TextStyle(fontSize: 55,fontWeight: FontWeight.bold),SizedBox(
              height: 20.0,RaisedButton(
              onpressed: () => _selectDate(context),child: Text(
                'Select date',style:
                TextStyle(color: Colors.black,color: Colors.greenAccent,);
  }

  buildCupertinoDatePicker(BuildContext context) {
    showModalBottomSheet(
        context: context,builder: (BuildContext builder) {
          return Container(
            height: MediaQuery.of(context).copyWith().size.height / 3,child: CupertinoDatePicker(
              mode: CupertinoDatePickerMode.date,onDateTimeChanged: (picked) {
                if (picked != null && picked != selectedDate)
                  setState(() {
                    selectedDate = picked;
                    myselectedDate = selectedDate;
                  });
              },initialDateTime: selectedDate,minimumYear: 2020,maximumYear: 2125,);
        });
  }

  buildMaterialDatePicker(BuildContext context) async {
    final DateTime picked = await showDatePicker(
      context: context,initialDate: selectedDate,firstDate: DateTime(2020),lastDate: DateTime(2125),initialEntryMode: DatePickerEntryMode.calendar,initialDatePickerMode: DatePickerMode.day,selectableDayPredicate: _decideWhichDayToEnable,helpText: 'Select booking date',cancelText: 'Not Now',confirmText: 'Book',errorFormatText: 'Enter valid date',errorInvalidText: 'Enter date in valid range',fieldLabelText: 'Booking date',fieldHintText: 'Date/Month/Year',builder: (context,child) {
        return Theme(
          data: ThemeData.light(),child: child,);
      },);
    if (picked != null && picked != selectedDate)
      setState(() {
        selectedDate = picked;
      });
  }
}

解决方法

您需要在正确的位置使用setState。在这里:

    onPressed: () {
      setState(() {
         myselectedDate=  DateFormat('dd MMMM,yyyy').format(selectedDate);
      });

      print('test=' + myselectedDate.toString());
      Navigator.of(context).pop();
    },