【问题标题】:NoSuchMethodError: The method '[]' was called on null. [Flutter]NoSuchMethodError:在 null 上调用了方法“[]”。 [扑]
【发布时间】:2021-11-15 10:27:49
【问题描述】:
class MessageScreen extends StatefulWidget {
  @override
  _MessageScreenState createState() => _MessageScreenState();
}

class _MessageScreenState extends State<MessageScreen> {
  var fanMessage = '';
  var userDocument;
  var userId;

  @override
  void initState() {
    super.initState();
    _getId();
  }

  TextEditingController messageController = TextEditingController();
  void _messageSubmit() {
    Firestore.instance
        .collection('messages/ne6MUaXi2wup9WOcZq85/alerts')
        .add({'text': messageController.text});
  }

  Future _getId() async {
    var test = await FirebaseAuth.instance.currentUser();
    setState(() {
      userId = test.uid;
      print(userId);
      Firestore.instance
          .collection('users')
          .document(userId)
          .get()
          .then((DocumentSnapshot documentSnapshot) {
        userDocument = documentSnapshot.data['role'];
      });
    });
  }

  // Widget _getId() {
  //   return FutureBuilder(future: Firestore.instance.collection('users'),child: Text());
  // }

  @override
  Widget build(BuildContext context) {
    print('User ID: ${userId}');

    print('User Role: ${userDocument}');
    return Scaffold(
        appBar: PreferredSize(
          preferredSize: Size.fromHeight(60.0),
          child: AppBar(
            title: Text('Fan Page'),
            actions: [
              DropdownButton(
                icon: Icon(
                  Icons.more_vert,
                  color: Theme.of(context).primaryIconTheme.color,
                ),
                items: [
                  DropdownMenuItem(
                      child: Container(
                        child: Row(
                          children: <Widget>[
                            Icon(Icons.exit_to_app),
                            SizedBox(
                              width: 8,
                            ),
                            Text('Logout')
                          ],
                        ),
                      ),
                      value: 'logout')
                ],
                onChanged: (itemIdentifier) {
                  if (itemIdentifier == 'logout') {
                    FirebaseAuth.instance.signOut();
                  }
                },
              )
            ],
          ),
        ),
        body: StreamBuilder(
          stream: Firestore.instance
              .collection('messages/ne6MUaXi2wup9WOcZq85/alerts')
              .snapshots(),
          builder: (ctx, streamSnapshot) {
            if (streamSnapshot.connectionState == ConnectionState.waiting) {
              return Center(
                child: CircularProgressIndicator(),
              );
            }
            final documents = streamSnapshot.data.documents;
            return ListView.builder(
              itemCount: documents.length,
              itemBuilder: (ctx, index) => Container(
                padding: EdgeInsets.all(10),
                child: Card(
                  elevation: 10,

                  // decoration:
                  // BoxDecoration(border: Border.all(color: Colors.black)),
                  child: Padding(
                    padding: const EdgeInsets.fromLTRB(5.0, 20.0, 5.0, 20.0),
                    child: Container(
                      child: Text(
                        documents[index]['text'],
                      ),
                    ),
                  ),
                ),
              ),
            );
          },
        ),
        floatingActionButton: Visibility(
          visible: checkIfAdmin(),
          child: Center(
            child: Container(
              alignment: Alignment.bottomCenter,
              child: Padding(
                padding: const EdgeInsets.fromLTRB(20, 0, 0, 70),
                child: FloatingActionButton(
                  child: Icon(Icons.add),
                  onPressed: () {
                    showDialog(
                      context: context,
                      builder: (BuildContext context) =>
                          _buildPopupDialog(context),
                    );
                  },
                ),
              ),
            ),
          ),
        ));
  }

  bool checkIfAdmin() {
    // getData();
    // print(userDocument['role']);
    if (userDocument == 'admin') {
      return true;
    } else {
      return false;
    }
  }

好的,我想要做的是,只为“管理员”用户角色显示浮动操作按钮。逻辑似乎在起作用,因为当我在启动应用程序后热重载一次时会发生这种情况。当我启动应用程序并登录时,我会看到一个红色窗口,并显示“无效参数”的错误消息,当我在不更改任何内容的情况下热重新加载时,我得到了我的屏幕,然后它就可以正常工作了。为什么会这样?我还没有完全理解状态概念。所以请帮忙!

编辑:我已经停止收到红屏错误消息。相反,应用程序启动。但是根据我的检查。

我的问题是我的应用程序只有在热重载后才能正常工作。只有在热重载管理员看到floatingActionButton。

在热重载之前的调试控制台中,我收到此错误:

未处理的异常:NoSuchMethodError:方法“[]”在 null 上被调用。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore firebase-authentication


    【解决方案1】:

    在您的情况下,只需使用可见性小部件包装 fab 并将其可见属性设置为 true/false。 所以你得到了:

    floatingActionButton: Visibility(
     visible: checkIfAdmin(),
     child: FloatingActionButton(
     child: Icon(Icons.add),
     onPressed: () {},
     ),
     ),
    

    还有一个方法:

    bool checkIfAdmin(){
    if(admin){
    return true;}
    else{
    return false;
    }   
    }
    

    【讨论】:

    • 你好。感谢回复。问题不在于显示是针对管理员或用户的。向管理员或用户显示它的功能正在运行。但它只有在热重载后才能正常工作。
    • 我尝试了这种方法来获取管理员,但错误仍然存​​在。安装应用程序并登录后,我会在红屏上收到无效参数作为错误
    【解决方案2】:

    稍微检查了您的代码,您的 setState 方法似乎没有导致重建,因为您为用户 ID 调用了 setState,而该用户 ID 在应用程序的状态中没有任何作用。 也考虑搬家

    Firestore.instance
    .collection('users')
    .document(userId)
    .get()
    .then((DocumentSnapshot documentSnapshot) {
    userDocument = documentSnapshot.data['role'];
    // print(userDocument);
    });
    

    构建方法之外。

    【讨论】:

    • 我遇到的是我没有按时从异步函数 _getId() 中获得价值。当我热重载应用程序时,我明白了。我不知道为什么我没有得到价值
    • dude ure app 正在破坏 caz ure 在 null 上调用 Firestore.instance .collection('users') .document(userId) .get(),因为服务器没有返回 userid 的值(所以它的null)但你称之为。
    • 设置 userDocument 的值,在你得到用户 id 之后。
    • 嘿。我照你说的做了。我已经更新了代码。请检查?
    • 嗨,你摆脱空错误了吗?
    猜你喜欢
    • 2021-09-22
    • 2020-05-23
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2021-11-30
    • 2021-03-11
    • 2021-09-29
    • 2021-06-18
    相关资源
    最近更新 更多