WillPopScope 是否有适当的替代品而不是 PopScope?

问题描述 投票:0回答:1

我制作了一个聊天应用程序,但我在它的聊天屏幕上遇到了问题,因为我使用 emoji_picker_flutte 包来显示表情符号板,并且我已经实现了它,以便每当表情符号板位于 bool 变量上时都是 true ,反之亦然如果用户首先使用后退导航手势,表情符号板将消失,然后如果用户再次使用后退导航手势,则页面将弹出。

使用 WillPopScope 时没有问题,但最近使用 PopScope 时没有问题,我尝试将整个代码放在

onPopInvoked
中,就像迁移所说的那样,将
canPop
设置为
false
但它不起作用。 我还尝试将整个代码使用到返回类型为
bool
的单独函数中,并在
canPop
上使用 t 函数,但它失败了,因为在使用这种方式表情符号板时,当该页面打开时
canPop
一直在运行甚至没有出现,因为当按下表情符号按钮并且变量变为
true
时,它会立即变为
false
,而一切正常工作。

bool _willpop() {
    if (_showEmoji) {
      setState(() => _showEmoji = !_showEmoji);
      return false;
    } else {
      return true;
    }
  }


PopScope (
canPop = _willpop();
child:...
)

其他方式

_willpop(bool p) {
    if (p) return;
    if (_showEmoji) {
      change();
      return false;
    } else {
      return true;
    }
  }

PopScope (
canPop: false,
onPopInvoked: (didpop) => _willpop(didpop),
child:...
)

这两种方法都不起作用,任何人都可以建议更好的方法吗

flutter dart widget dart-pub
1个回答
0
投票

在第二种方式中,如果 p 为真,则不返回任何内容。只需删除该行即可。

if (p) return;

现在,如果 _showEmoji 为 true,则只需反转其值并调用 setState,但如果为 false,则使用 Navigator.pop(context) 来弹出

_willpop(bool p) {
    if (_showEmoji) {
      change();
    } else {
      Navigator.pop(context);
    }
  }

不确定为什么你的第一种方法不起作用。现在无法测试,但尝试上面的第二种方法,它会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.