Я хочу передать данные со 2-го экрана на 1-й экран во флаттере

Я делаю простое приложение TODO, и я хотел передать данные со 2-го экрана моего приложения на 1-й экран. Мой первый экран изначально пустой, и мне нечего отображать, и на нем есть плавающая кнопка для добавления задачи. При нажатии на нее происходит переход на вторую страницу, где пользователь вводит задачу и автора, нажимает кнопку "Отправить" и переводит нас на 1-ю страницу, где она отображается. Я хочу передать данные в виде списка. Я пробую все за последние 24 часа, которые я реализовал с помощью ModalRoute, а также создал один экземпляр класса ToDo, чтобы он не выдавал ошибку NULL, но ничего не работает. Прилагаю код, чтобы вы поняли мою проблему.

Это мой FirstScreen()

import 'package:flutter/material.dart';
import 'todo.dart';
import 'todocard.dart';

class ToDos extends StatefulWidget{
 @override
 _ToDosState createState() => _ToDosState();
}

class _ToDosState extends State<ToDos> {

@override
Widget build(BuildContext context) {

List<ToDo> todos =[

];
final routeArgs = ModalRoute.of(context).settings.arguments as Map ;
todos.add(ToDo(author: routeArgs['task'],task: routeArgs['author']));

 return Container(
  child: Scaffold(
    appBar: AppBar(
      title: Text("TODO LIST"),
      centerTitle: true,
    ),
    body: Column(
      children:todos.map((e) => ToDoCard(
          todo: e,
      )).toList(),
      //ToDoCard is just a Card widget

    ),
    floatingActionButton: FloatingActionButton(
      elevation: 0.0,
      child: Text("+"),
      onPressed: ()
      {
        Navigator.pushNamed(context, '/add_task');
      },
    ),
  ),

);

}}

Мой второй экран:

import 'package:flutter/material.dart';

class AddTask extends StatefulWidget {
  @override
  _AddTaskState createState() => _AddTaskState();
}

class _AddTaskState extends State<AddTask> {
  @override
  Widget build(BuildContext context) {
    String author,task;
    return Container(
        child: Scaffold(
          appBar: AppBar(
            title: Text("ADD TASK"),
            centerTitle: true,
          ),
          body: Column(
            children: <Widget>[
              Text("Enter Your Task"),
              TextField(
                decoration: InputDecoration(
                    border: InputBorder.none,
                    hintText: 'task'
                ),
                onChanged: (text){
                  task = text;
                },
              ),

              TextField(
                decoration: InputDecoration(
                    border: InputBorder.none,
                    hintText: 'author'
                ),
                onChanged: (text){
                  author = text;
                },
              ),

              Row(
                children: <Widget>[
                  RaisedButton(
                    onPressed: () {
                      Navigator.pop(context, {
                        'author': author,
                        'task': task,
                      });
                    },
                    child: Text("Submit"),
                  ),
                  SizedBox(width: 10.0,),
                  RaisedButton(
                    onPressed: () {
                      Navigator.pop(context);
                    },
                    child: Text("Cancel"),
                  ),
                ],
              )

            ],
          ),
        ));
  }
}

Main.dart выглядит следующим образом:

import 'package:flutter/material.dart';
import 'todo.dart';
import 'add_task.dart';
import 'display_todo.dart';

void main() {
  runApp(MaterialApp(
    title: 'Passing Data',
    initialRoute: '/',
    routes: {
      '/': (context) => ToDos(),
      '/add_task': (context) => AddTask(),
    },
  ));
}

ToDoCard для отображения информации в виде карты:

import 'todo.dart';
import 'package:flutter/material.dart';

class ToDoCard extends StatelessWidget {
  final ToDo todo;
  ToDoCard({this.todo});
  @override
  Widget build(BuildContext context) {
    return Card(
      color: Colors.cyan,
      margin: EdgeInsets.fromLTRB(20, 20, 20, 0),
      child: Padding(
        padding: EdgeInsets.fromLTRB(13, 10, 13, 10),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[

            Text(
              todo.author,
              style: TextStyle(
                color: Colors.black,
                fontSize: 20.0,
              ),
            ),
            SizedBox(height: 10.0,),
            Text(
              todo.task,
              style: TextStyle(
                color: Colors.black,
                fontSize: 20.0,
              ),
            ),
            SizedBox(height: 10.0,),
//            RaisedButton.icon(onPressed: delete, icon: Icon(Icons.delete), label: 
Text("Delete quote"), color: Colors.red,),

          ],
        ),
      ),
    );
  }
}

ToDo класс:

class ToDo{
final String task;
final String author;
ToDo({this.task,this.author});
}

1 ответ

Решение

Вы можете передать результат обратно на Navigator.pop() и получить его awaitв pushNamed вызов.

Получить значение на странице 1:

onPressed: () async
{
  dynamic result = await Navigator.pushNamed(context, '/add_task');
  if(result != null) {
    setState(() {todos.add(result);});
  }
},

Передайте значение со страницы 2 в кнопке отправки

onPressed: () {
  Navigator.pop(context, ToDo(task: task, author: author));
},
Другие вопросы по тегам