我想将数据从第二屏幕传递到第一屏幕

时间:2020-07-18 14:32:59

标签: flutter dart flutter-routes

我正在制作一个简单的TODO应用,我想将数据从应用的第二屏幕传递到第一屏幕。我的第一个屏幕最初是空白的,没有任何显示,它有一个浮动按钮来添加任务。单击后,将转到第二页,用户在其中输入任务和作者,然后单击“提交”按钮,然后将我们带到第一页,在此显示。我想将数据作为List传递。最近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');
      },
    ),
  ),

);

} }

我的SecondScreen是:

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(),
    },
  ));
}

用于将信息显示为Card的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 个答案:

答案 0 :(得分:2)

您可以将结果传回oxfi = "adaptation n. C1 addiction n. B2 additionally adv. B2 adequate adj. B2 adequately adv. B2 adhere v. C1 adjacent adj. C1 adjust v. B2 adjustment n. C1 administer v. C1 administrative adj. C1 administrator n. C1 admission n. C1 adolescent n. C1 adoption n. C1 adverse adj. C1 advocate n., v. C1 aesthetic adj. C1 affection n. C1 affordable adj. B2" oxfi = oxfi.split() oxfier = oxfi.split() for word in oxfi: if oxfi[1] == 'n.,' and oxfi[2] == 'v.': dict['noun'].append(oxfier[0]) dict['verb'].append(oxfier[0]) del oxfier[0:4] if oxfi[1] == 'n.': dict['noun'].append(oxfier[0]) del oxfier[0:3] if oxfi[1] == 'adj.': dict['adj'].append(oxfier[0]) del oxfier[0:3] if oxfi[1] == 'v.': dict['verb'].append(oxfier[0]) del oxfier[0:3] if oxfi[1] == 'adv.': dict['adv'].append(oxfier[0]) del oxfier[0:3] if oxfi[1] == 'prep.': dict['prep'].append(oxfier[0]) del oxfier[0:3] print("oxfi = " + str(oxfier) + '\n') print("dict = " + str(dict) + '\n') 并通过Navigator.pop()调用await进行检索。

在第1页中检索值

pushNamed

通过提交按钮中的第2页传递值

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