возврат нескольких данных на другой экран flutter

#flutter #dart #navigation #screen

#flutter #dart #навигация #экран

Вопрос:

Я изо всех сил пытаюсь вернуть разные данные на свой рабочий стол. У меня есть экран Mypage (), на котором отображаются карточки в listview с заголовком и текстом. Я новичок в flutter, и я действительно не знаю, как вернуть данные с моего другого экрана с именем WritingPage(), где есть два текстовых поля. Вот мой фактический код для кнопки на Mypage():

 FlatButton(
          onPressed: (){
            Navigator.of(context).push(MaterialPageRoute(
                builder: (context){
                  return WritingPage();
                })).then((value) {
              dreams.add(value);
              print(dreams);
              setState(() {});
            })
            ;
          },
          child: Icon(Icons.add, size: 30,),
          color: Colors.black,
          shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
        ),
 

Затем, вот код WritingPage():

 class WritingPage extends StatefulWidget {
@override
_WritingPageState createState() => _WritingPageState();
}

class _WritingPageState extends State<WritingPage> {
String text;

void submit(){
Navigator.of(context).pop(_textEditingController.text);
}

TextEditingController _textEditingController = TextEditingController();
TextEditingController _titleEditingController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
  backgroundColor: Colors.black,
  appBar: AppBar(
    backgroundColor: kEdgeColor,
    title: Text('Writing part'),
  ),
  body: Container(
    child: Column(
      children: [
        TextField(
          controller: _textEditingController,
          obscureText: false,
          decoration: InputDecoration(
            border: OutlineInputBorder(
              borderRadius: BorderRadius.all(const Radius.circular(12))
            )
          ),
        ),
        TextField(
          controller: _titleEditingController,
          obscureText: false,
          decoration: InputDecoration(
              border: OutlineInputBorder(
                  borderRadius: BorderRadius.all(const Radius.circular(12))
              )
          ),
        ),
        RaisedButton(onPressed : ()=> submit()),
      ],
    ),
  ),
);
}
}
 

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

Если вам нужна дополнительная информация, пожалуйста, спросите меня, заранее спасибо!

Ответ №1:

В MyPage

 FlatButton(
    onPressed: () async {
      final result = await Navigator.of(context).push(MaterialPageRoute(builder: (context){return WritingPage();})); 
      if (null != result) {
        dreams.add(result);
        print(dreams);
        setState(() {});
      }
    },
    child: Icon(Icons.add, size: 30,),
    color: Colors.black,
    shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
),
 

В WritingPage

 void submit() {
    Navigator.of(context).pop({
      "text": _textEditingController.text.trim(),
      "title": _titleEditingController.text.trim();
    });
}
 

Комментарии:

1. Я получил сообщение об ошибке, но я думаю, это потому, что dreams — это список, а не карта. Ну, я не знаю, что использовать, чтобы сохранить заголовок и содержимое, а затем использовать их в карточке в listview. Вот ошибка: тип ‘_InternalLinkedHashMap<Строка, строка>’ не является подтипом типа ‘String’

2. Каков тип содержимого переменной dreams ?

3. статический список снов = [];

4. Что вы используете dreams в своем виджете Card?

5. Ну, это мой конструктор card, но я действительно не знаю, как его использовать: класс DreamCard расширяет StatelessWidget { DreamCard({this . Содержимое, this.title}); заголовок конечной строки; содержимое конечной строки;

Ответ №2:

Одним из решений этого является определение класса в другом файле, а затем вы можете ссылаться на этот класс с нескольких страниц, просто не забудьте использовать setState . Кроме того, если вы открываете контекст, обязательно перестройте исходную страницу при возврате.