Как передать дату из виджета, прежде чем вставлять его в флаттер? - PullRequest
0 голосов
/ 05 февраля 2019

Я использую виджет поля формы от флаттера https://pub.dartlang.org/packages/datetime_picker_formfield

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

Я пытался поместить его в статическую переменную и получить к нему доступ, но это не сработало, у меня слабый дротик, поэтому я не мог заставить классы иметь взаимную переменную, которую я могу использовать при инициализации виджета какобъект с определенной переменной

И попытался получить переменную через геттер, но не смог этого сделать.

Родительский виджет, который вызывает класс dateTime:

 class addReminder extends StatelessWidget{
   dateTimeWidget = new dateTime();
 DateTime date;
 @override
 Widget build(BuildContext context){
 return Scaffold(
  appBar: AppBar(
    title: Text('Add a Reminder'),

  ),
  body:
  new Container(
    padding: new EdgeInsets.all(20.0),
    child: new Form(
      child: new ListView(
        children: <Widget>[

          new TextFormField(
            keyboardType: TextInputType.text, // Use email input type for emails.
            decoration: new InputDecoration(
              hintText: 'Title of reminder',
            ),

          ),
          dateTimeWidget,
          RaisedButton(
            child: Text('Save'),
            onPressed:(){
              //This is where I want to extract the date and save it to a local variable (date in this case)
              Navigator.pop(context);

            },
          )
        ],
      ),
    ),
  ),
);

}}

Виджет DateTime, который использует DateTimePickerFormField с виджетом и классом состояния:

import 'package:flutter/material.dart';
import 'package:datetime_picker_formfield/datetime_picker_formfield.dart';
import 'package:intl/intl.dart';
class dateTime extends StatefulWidget{
  @override
 dateTimeState createState() => dateTimeState();

  }
   class dateTimeState extends State<dateTime>{

 static DateTime dateT;

 InputType inputType = InputType.both;

 final formats = {
 InputType.both: DateFormat("EEEE, MMMM d, yyyy 'at' h:mma"),
 InputType.date: DateFormat('yyyy-MM-dd'),
InputType.time: DateFormat("HH:mm"),
 };

  Widget build(BuildContext context) => Container(
    child: DateTimePickerFormField(
     inputType: InputType.both,
     editable: true,
     format: formats[inputType],
     decoration: InputDecoration(
         labelText: 'Date/Time', hasFloatingPlaceholder: false),
     onChanged: (dt) => setState(() => dateT = dt),

   )


 );

} ​​

Позже я попытался это сделать:

Добавил этот метод в класс addReminder:

  dateTimee(BuildContext context) async {
 final result = await Navigator.push(
    context,
  MaterialPageRoute(builder: (context)=> dateTime()),
   );

}

и назвал его так:

  dateTimee(context),

и в классе dateTime в добавленном параметре я добавил

      onChanged: (dt) {
        setState(() => dateT = dt);
        Navigator.of(context).pop(dateT);
       },

Однако я получаю ошибку:

  I/flutter (18662): Another exception was thrown: 
  'package:flutter/src/widgets/navigator.dart': Failed assertion: line1995 
  pos 12: '!_debugLocked': is not true.

Я думаю, это потому, что метод типа Future, где вызов должен быть виджетом, поэтому я не знаю, что делатьВиджет, который я называю dateTimee, основан на вызове виджета dateTimePickerFromField

1 Ответ

0 голосов
/ 05 февраля 2019

Посмотрите кулинарную книгу https://flutter.io/docs/cookbook/navigation/returning-data

В итоге: Navigator.push возвращает будущее, которое завершится, когда отправленный виджет вызовет Navigator.pop.Вы можете передать возвращаемое значение pop, которое будет значением, с которым разрешается будущее.

// In widget 1..
final result = await Navigator.of(context).push(...);

// In widget 2..
Navigator.of(context).pop('output');

Затем, когда виджет 2 вызовет pop, будущее, которое ожидает виджет 1, завершится, и result переменная будет присвоена строке 'output'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...