【问题标题】:Unusual bug due to keyboard in Flutter PageView由于 Flutter PageView 中的键盘导致的异常错误
【发布时间】:2021-11-13 03:43:51
【问题描述】:

我的 Flutter Android 应用有一个主页,该主页由一个以 PageView 作为主体的 Scaffold 组成。 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;
  }
}

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

似乎激活键盘会以某种方式弄乱 ChangeNotifierProdiver UserDataModel。这似乎是一个非常小众的错误,所以任何帮助将不胜感激!

【问题讨论】:

    标签: flutter keyboard flutter-provider flutter-pageview


    【解决方案1】:

    这个错误对我来说意味着

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

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

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

    2. 在调用 admin 之前只需检查 null。

    为什么键盘会发生这种情况很难。我怀疑键盘输入后重建过程的某些内容没有调用 customClaims 并且因为该值未保存在成员变量中,所以最终为 null。

    【讨论】:

    • 谢谢!我现在让应用程序将 isAdmin 变量传递给 HomePage 小部件,这样 FAB 处理程序就不必访问 UserDataModel 并且错误消失了。
    猜你喜欢
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2015-07-09
    • 2014-10-11
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多