首页 > 解决方案 > 如何从另一个有状态小部件调用的有状态小部件正确返回数据?

问题描述

我正在从有状态小部件调用日期时间选择器小部件。我需要能够在调用它的小部件中使用从日期时间小部件中选择的值。解决这个问题的正确方法是什么?

这就是调用它的小部件的外观。当然瘦了。

        SingleChildScrollView(
          child:Container(
            //WRAPS ENTIRE SHEET
            decoration: BoxDecoration(
                gradient: LinearGradient(
                    colors: [Colors.blue, Colors.red],
                    begin: Alignment.bottomCenter,
                    end: Alignment.topCenter,
                    stops: [0.1, 1])),
            height: MediaQuery.of(context).size.height * .40,
            child: ListView( children: [
              SizedBox(
                height: 10,
              ),
              Container(
                  child: DatePicker(optionalText: "")
              ),
            ],),
          ),
        )
      ],);
  }

这是我需要返回数据的小部件

 class _DatePickerState extends State<DatePicker> {
  DateTime selectedDate = DateTime.now();


   @override
   Widget build(BuildContext context) {
     return Container(
      child: Row(
       mainAxisAlignment: MainAxisAlignment.start,
       children: <Widget>[
        Container(
         width: MediaQuery.of(context).size.width * .50,
         height: MediaQuery.of(context).size.height * .07,
         child: Padding(
          padding: EdgeInsets.fromLTRB(33, 0, 5, 0),
          child: RaisedButton(
           color: Colors.white,
           shape: RoundedRectangleBorder(
               borderRadius: BorderRadius.circular(10)),
           child: dateHyphenReplacer(selectedDate),
           onPressed: () => _selectDate(context),
          ),
         ),
        ),
        Padding(
         padding: EdgeInsets.fromLTRB(5, 10, 0, 10),
         child: Icon(
          Icons.calendar_today,
          color: Colors.white,
          size: 30,
         ),
        ),
        Container(
         child: Padding(
          padding: EdgeInsets.all(8.0),
          child: AutoSizeText(
           'Choose ${widget.optionalText} Date',
           style: TextStyle(
               color: Colors.white,
               fontStyle: FontStyle.italic,
               fontFamily: 'Montserrat'),
          ),
         ),
        ),
       ],
      ),
     );
   }

   Future<void> _selectDate(BuildContext context) async {
    final DateTime picked = await showDatePicker(
        context: context,
        initialDate: selectedDate,
        firstDate: DateTime(2015, 8),
        lastDate: DateTime(2101));
    if (picked != null && picked != selectedDate)
     setState(() {
      selectedDate = picked;
     });
    return selectedDate;
   }

  dateHyphenReplacer(date){
     date = formatDate(date, [mm, '/',dd,'/',yy]);
     return Text('$date', style: TextStyle(color: Colors.blue, fontSize: 20));
  }

  }

标签: flutter

解决方案


将变量存储DateTime在父窗口小部件中并将其传递给DatePicker构造函数。选择A时DateTime,设置widget.selectedDateTime。但是,这种方法不会自动重建父窗口小部件,因此不会更新对DateTime.


推荐阅读