Я хочу передать данные со 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));
},