【问题标题】:How to get return value with pop on Flutter?如何在 Flutter 上使用 pop 获取返回值?
【发布时间】:2021-06-06 21:24:40
【问题描述】:

我想知道如何在 Flutter 上使用 pop 获取两个值。 我试着写代码。但我得到了异常“必须向文本小部件提供非空字符串。”

这里是代码。

第一个屏幕

                      ElevatedButton(
                        child: const Text('move to second screen'),
                        style: ElevatedButton.styleFrom(
                            primary: Colors.orange, onPrimary: Colors.white),
                        onPressed: () async {
                          final List<String> _response =
                              await Navigator.pushNamed(
                                  context, '/adminCategoryPicker');
                          emoji = _response[0];
                          emojiName = _response[1];
                        },
                      ),

第二屏

return Card(
                  child: ListTile(
                    leading: Text(targetElectricsEmojiLists[index]),
                    title: Text(targetElectricsNameLists[index]),
                    onTap: () {
                      setState(() {
                        _selectedName = targetElectricsNameLists[index];
                        _selectedEmoji = targetElectricsEmojiLists[index];
                      });
                      Navigator.pop(
                        context,
                        {_selectedName, _selectedEmoji},
                      );
                    },
                  ),
                );

我认为这个问题在下面的部分。你知道写代码的其他方法吗?

第一个屏幕

onPressed: () async {
     final List<String> _response =
     await Navigator.pushNamed(
          context, '/goToSecondScreen');
           emoji = _response[0];
           emojiName = _response[1];
},

第二屏

Navigator.pop(
       context,
       {_selectedName, _selectedEmoji},
);

我更改了代码。此外,我得到了错误。

[ERROR:flutter/lib/ui/ui_dart_state.cc(186)] 未处理的异常:类型“MaterialPageRoute”不是类型“Route?”的子类型在类型转换中

第一个屏幕

ElevatedButton(
                        child: const Text('move to second screen'),
                        style: ElevatedButton.styleFrom(
                            primary: Colors.orange, onPrimary: Colors.white),
                        onPressed: () async {
                          final List<String> _response =
                              await Navigator.pushNamed(
                                  context, '/adminCategoryPicker');
                          emojiName = _response[0];
                          emoji = _response[1];
                        },
                      ),

第二屏

return Card(
                  child: ListTile(
                    leading: Text(targetElectricsEmojiLists[index] ?? 'null'),
                    title: Text(targetElectricsNameLists[index] ?? 'null'),
                    onTap: () {
                      setState(() {
                        _selectedName = targetElectricsNameLists[index];
                        _selectedEmoji = targetElectricsEmojiLists[index];
                      });
                      Navigator.pop(
                        context,
                        [_selectedName, _selectedEmoji],
                      );
                    },
                  ),
                );

【问题讨论】:

  • 我尝试了以下答案。但是,我刚刚收到错误消息,[ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: type 'MaterialPageRoute' is not a subtype of type 'Route>? '在类型转换中

标签: flutter dart


【解决方案1】:

你可以试试下面的方法

第一个屏幕

                 ElevatedButton(
                    child: const Text('move to second screen'),
                    style: ElevatedButton.styleFrom(
                        primary: Colors.orange, onPrimary: Colors.white),
                    onPressed: () {
                       
                        Navigator.pushNamed(context,'/adminCategoryPicker')
                        .then((value) 
                          {
                             emoji = (value as Map)['emoji'];
                             emojiName =  (value as Map)['emojiName'];
                          });
                       },
                     ),

第二屏

return Card(
                  child: ListTile(
                    leading: Text(targetElectricsEmojiLists[index]),
                    title: Text(targetElectricsNameLists[index]),
                    onTap: () {
                      setState(() {
                        _selectedName = targetElectricsNameLists[index];
                        _selectedEmoji = targetElectricsEmojiLists[index];
                      });
                      Navigator.pop(
                        context,{'emoji':_selectedName,'emojiName':_selectedEmoji}
                      );
                    },
                  ),
                );

【讨论】:

  • 感谢您回复我的问题。我很感激!有用。我认为我必须使用列表。为什么一定要用作地图?
  • 不客气 :) 关于 Map:回调的返回类型为 Object,因此您必须显式转换您正在使用的类型
【解决方案2】:

我认为您返回的字符串列表格式错误。字符串需要在方括号内。像这样:

Navigator.pop(
       context,
       [_selectedName, _selectedEmoji],
);

关于错误“必须向文本小部件提供非空字符串。”,当您将空值传递给文本小部件时会发生这种情况。您可以像这样在第二个屏幕中更改文本小部件以检查空值,并在文本小部件中包含非空虚拟文本并消除错误:

return Card(
                  child: ListTile(
                    leading: Text(targetElectricsEmojiLists[index] ?? 'NULL value here'),
                    title: Text(targetElectricsNameLists[index] ?? 'NULL value here'),
                    onTap: () {
                      setState(() {
                        _selectedName = targetElectricsNameLists[index];
                        _selectedEmoji = targetElectricsEmojiLists[index];
                      });
                      Navigator.pop(
                        context,
                        {_selectedName, _selectedEmoji},
                      );
                    },
                  ),
                );

【讨论】:

  • @MasayaStripes 编辑了我的答案,试一试。
  • 我试过上面的代码。但我得到了下面的错误。 [错误:flutter/lib/ui/ui_dart_state.cc(186)] 未处理的异常:类型“MaterialPageRoute”不是类型“Route>?”的子类型在类型转换中
【解决方案3】:

第一个屏幕

onPressed: () async {
     final dynamic _response =
     await Navigator.pushNamed(
          context, '/goToSecondScreen');
           emoji = _response["selectedName"];
           emojiName = _response["selectedEmoji"];
},

第二屏

Navigator.pop(
       context,
       {"selectedName":_selectedName,"selectedEmoji": _selectedEmoji},
);

【讨论】:

  • 我认为 _response["selectedName"];必须在这个数组中使用整数。
  • 将 _response 数据类型从 List 更改为动态
猜你喜欢
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2019-05-20
  • 2013-10-26
  • 2012-02-29
  • 2018-06-15
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多