Flutter Navigator 弹出和异步多字段数据

Posted

技术标签:

【中文标题】Flutter Navigator 弹出和异步多字段数据【英文标题】:Flutter Navigator pop and async multiple fields data 【发布时间】:2019-12-13 21:29:27 【问题描述】:

我有两个文本控制器,我想将两个文本控制器的数据从第二页传递到主屏幕,现在我的代码与一个变量一起工作正常,但我如何传递多个变量并使用它们。

Container(
                  margin: EdgeInsets.only(top:30),
                  child:RaisedButton(
                    onPressed: ()
                    Navigator.pop(context, titleController.text); //i want to pass multiple controllers here
                      print(titleController.text);

                    ,
                    child: Text("Submit"),
                  ),
                ), 

用途: 这是我如何使用返回的数据。它适用于一个文本字段,但我希望传递多个字段。

_navigateAndDisplaySelection(BuildContext context) async 

 final result = await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => SecondScreen()),
    );

              varlistSection.insert(0,
            listSectionMethod("$result", "hello from click", Icons.forward), //result contains one text field data, i want to use it for more
          );
          setState(() );
  

【问题讨论】:

只需传递所有控制器文本的列表。 那么我该如何使用它们,我试图让变量 result[] 包含数组,但它是错误的 只需使用for 循环来获取所有文本。 我该怎么做,我认为应该还有其他解决方案 @Fayakon,本杰明是对的。只需从您的第二页返回列表。如何使用检索到的列表取决于您在做什么。您打算如何在第一页中显示数据? 【参考方案1】:

Fayakon,你为一个变量所做的看起来不错。当你像这样弹出它时,尝试从第二页返回一个字符串列表,

List<String> list = new List<String>();
list.add(titleController.text);
list.add(detailController.text);
Navigator.pop(context, list);

然后在你的第一页的功能中使用它,

_navigateAndDisplaySelection(BuildContext context) async 

 final result = await Navigator.push(context,
      MaterialPageRoute(builder: (context) => SecondScreen()),
    );

 varlistSection.insert(0,
            listSectionMethod(result[0], result[1], Icons.forward), //index would be for the data you wanna use
          );
 setState(() );

【讨论】:

我尝试了 listSectionMethod("$result", "$result[1]", Icons.forward),我将它们与 [1], $result[1] 放在一条线上是我传递它的方法的字符串类型。如果我键入诸如 listSectionMethod("title", "detail", Icons.forward) 之类的核心值,它将在顶部和描述底部显示标题,但是当我使用 $result 和代码中的索引时,一切都在一行中。 知道了; listSectionMethod(result[0], result[1], Icons.forward), 好吧,我不知道你在用什么,但很高兴它有帮助。不客气【参考方案2】:
import 'package:flutter/material.dart';

void main() 
runApp(MaterialApp(home: MyApp(), debugShowCheckedModeBanner: 
false));
 

类 MyApp 扩展 StatefulWidget const MyApp(Key key) : super(key: key);

@override
_MyAppState createState() => _MyAppState();


 class _MyAppState extends State<MyApp> 
 final GlobalKey<AnimatedListState> key = GlobalKey();
 GlobalKey<FormState> _formkey = GlobalKey<FormState>();

  List<String> _items = [];

   Future<String> showInfoDialog(BuildContext) async 
   return await showDialog(
    context: context,
    builder: (context) 
      final TextEditingController _textTitleController =
          TextEditingController();
      final TextEditingController _textDiscriptionController =
          TextEditingController();
      return AlertDialog(
        content: Form(
            key: _formkey,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                TextFormField(
                  controller: _textTitleController,
                  validator: (value) 
                    return value.isEmpty ? "Invalid Field" : null;
                  ,
                  decoration:
                      InputDecoration(hintText: "Enter Report Title"),
                ),
                TextFormField(
                  controller: _textDiscriptionController,
                  validator: (value) 
                    return value.isEmpty ? "Invalid Field" : null;
                  ,
                  decoration:
                      InputDecoration(hintText: "Enter Report 
        Discrption"),
                )
              ],
            )),
        actions: <Widget>[
          TextButton(
              child: Text('submit'),
              onPressed: () 
                if (_formkey.currentState.validate()) 
                  Navigator.of(context)
                      .pop(_textTitleController.text.toString());
                
              )
        ],
      );
    );
  

  @override
   Widget build(BuildContext context) 
   return MaterialApp(
    debugShowCheckedModeBanner: false,
    home: Scaffold(
      appBar: AppBar(
        title: Text('Alert'),
        backgroundColor: Colors.red[800],
        elevation: 2,
      ),
      body: AnimatedList(
        key: key,
        initialItemCount: _items.length,
        itemBuilder: (context, index, animation) 
          return _buildItem(
            _items[index],
            animation,
            index,
          );
        ,
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () async 
          await showInfoDialog(context).then((value) 
            int i = _items.length > 0 ? _items.length : 0;
            _items.insert(i, value);
            key.currentState.insertItem(i);
          );
        ,
      ),
    ));
  

  Widget _buildItem(String items, Animation animation, int index) 
  return SizeTransition(
  sizeFactor: animation,
  child: Card(
    elevation: 2,
    child: ListTile(
      title: Text(
        items,
        style: TextStyle(fontWeight: FontWeight.w600),
      ),
      subtitle: Text("crush report in the main road"),
      leading: const Icon(
        Icons.warning_rounded,
        color: Colors.red,
        size: 30,
      ),

      // CircleAvatar(
      //   backgroundColor: Colors.red,
      // ),
      trailing: IconButton(
        icon: Icon(
          Icons.close,
          color: Colors.redAccent,
        ),
        onPressed: () 
          _removeItem(index);
        ,
      ),
    ),
  ),
);


void _removeItem(int i) 
String removedItem = _items.removeAt(i);
AnimatedListRemovedItemBuilder builder = (
  context,
  animation,
) 
  return _buildItem(removedItem, animation, i);
;
key.currentState.removeItem(i, builder);



【讨论】:

请不要只是转储一堆代码。相反,尝试解释您的代码在做什么,以及为什么这样可以解决问题。请记住,许多读者都是 Flutter 的新手,因此帮助他们理解这些概念将使这成为一个更有用的答案。在此过程中,请修正您的代码格式。

以上是关于Flutter Navigator 弹出和异步多字段数据的主要内容,如果未能解决你的问题,请参考以下文章

flutter 监听软键盘的弹出和关闭

js 监听手机端键盘弹出和收起事件

Flutter Navigator v2.0 如何弹出子嵌套路由

Flutter Navigator 路由总是“/”

Flutter Navigator 移除直到

Flutter页面导航