由于 Flutter PageView 中的键盘导致的异常错误

Unusual bug due to keyboard in Flutter PageView

我的 Flutter Android 应用程序有一个主页,该主页由一个以 PageView 为主体的脚手架组成。 PageView 有两个页面:第一页是新闻源,第二页是日历。每个页面都有自己的自定义 FloatingActionButton。 ChangeNotifierProvider 处理页面更改,以便 FAB 在页面索引更改时更改。第二页上的 FAB 仅在应用程序的用户具有管理员权限时显示,它存储在第二个 ChangeNotifierProvider 中。在伪代码中,FAB 处理程序看起来像这样:

if (pageIndex == 0) {
  return NewsFeedFAB;
}
if (pageIndex == 1) {
  if (context.watch<UserDataModel>().currentUser.customClaims.admin) { // important line
    return CalendarFAB;
  } else {
    return null;
  }
}

现在我的问题来了。打开应用程序时,我可以毫无问题地滑动页面。一切都按预期工作。但是,当我在新闻源页面上打开键盘(这是可能的,因为用户可以在帖子上写评论)然后尝试滑动到第二页时,我收到错误消息:The getter 'admin' was called on null.(请参阅 'important line'在代码中)。我应该注意到,当索引更改以关闭键盘时,pageIndexChangeHandler 使焦点节点失去焦点。我认为这可能与问题有关,但如果我让键盘出现,然后手动关闭它,然后再滑动,就会发生同样的错误。

似乎激活键盘以某种方式弄乱了 ChangeNotifierProdiver UserDataModel。这似乎是一个非常小众的错误,因此我们将不胜感激!

错误提示我

context.watch<UserDataModel>().currentUser.customClaims

可以为空。为什么它可能为空?没有看到代码就不能说,但是有不同的方法可以解决这个问题。

  1. 做一个State的成员变量,bool? _isAdmin,从 initState() 分配它,如果它是可变的 属性,请在那里监听变化。

  2. 在调用管理员之前简单地检查是否为空。

为什么键盘会发生这种情况是一个难题。我怀疑键盘输入后重建过程的某些事情没有召回 customClaims 并且因为该值未保存在成员变量中所以最终为 null。