【问题标题】:A nullable expression can't be used as an iterator in a for-in loop. Try checking that the value isn't 'null' before using it as an iterator可空表达式不能用作 for-in 循环中的迭代器。在将其用作迭代器之前尝试检查该值是否不是“空”
【发布时间】:2022-02-18 22:35:50
【问题描述】:

我必须从 Firebase 数据库中获取数据,并通过“keys”键获取所有数据并将它们插入到“postsList”中。为此,我使用了 for-in 循环。后者给我一个错误。

错误是:“可空表达式不能用作 for-in 循环中的迭代器。在将其用作迭代器之前,请尝试检查该值是否不是 'null'。” em>

class _HomePageState extends State<HomePage> {

  List<Posts> postsList = [];


  @override
  void initState() {

    super.initState();


    DatabaseReference postsRef = FirebaseDatabase.instance.reference().child("Posts");

    postsRef.once().then((snap)
        {

      var keys = snap.snapshot.key;
      var values = snap.snapshot.value;

      postsList.clear();

      for (var individual in keys) {
        Posts posts = Posts(
          values[individual]['url'],
          values[individual]['descrizione'],
          values[individual]['data'],
          values[individual]['ora'],
        );
        postsList.add(posts);
      }


      setState(()
      {
       print('Length : $postsList.length');
      });

    });
  }

【问题讨论】:

    标签: flutter dart firebase-realtime-database


    【解决方案1】:

    错误消息应带有指向unchecked use of a nullable value 上此文档页面的链接。正如错误所说,您在for (var individual in keys) { 中使用的keys 变量可以为null,这是不允许的。您应该检查它是否为空,或者断言它不为空:

    if (keys != null) {
      for (var individual in keys) {
        Posts posts = Posts(
          values[individual]['url'],
          values[individual]['descrizione'],
          values[individual]['data'],
          values[individual]['ora'],
        );
        postsList.add(posts);
      }
    }
    

    以上解决了语法/编译器问题,但您的代码中可能还有其他问题,因为我怀疑您的keys 变量将是一个值为Posts 的字符串。如果是这种情况,请考虑使用与上述相同的空检查来循环 values


    地图.from(event.snapshot.value)

    map.forEach((k, v) => print("Key : $k, Value : $v"));

    DatabaseReference postsRef = FirebaseDatabase.instance.reference().child("Posts");
    
    postsRef.once().then((snap) {
      // ? Get a map of the top-level post keys and post values
      var map = Map<String, dynamic>.from(snap.snapshot.value);
    
      postsList.clear();
    
      // ? Loop over the post keys and post values
      map.forEach((key, value) {
        // ? Get the values for this post as another map
        var values = Map<String, dynamic>.from(map);
        Posts posts = Posts(
          values['url'],
          values['descrizione'],
          values['data'],
          values['ora'],
        );
        postsList.add(posts);
      });
    
      setState(() {
        print('Length : $postsList.length');
      });
    });
    

    【讨论】:

    • 实际上现在错误变成了:“'for'循环中使用的'String'类型必须实现Iterable。”我该如何继续?
    • 您是否阅读了我的答案的后半部分并应用了它?
    • 是的,我在 for 循环中遇到了关于“值”的错误:“'for' 循环中使用的类型 'Object' 必须实现 Iterable”
    • 所以这又是一个不同的错误。你认为values 是什么类型的?您是否尝试将其转换为那种类型?
    • values 是对象类型,它是这样完成的:-MsjPJX5n5eOQiQKvMIR: {descrizione: mama, data: Jan 6, 2022, url: firebasestorage.googleapis.com/v0/b/blogap..[], ora: Thursday, 01:42 PM },
    【解决方案2】:

    在键后添加!,例如:for(key in keys!

      @override
      void initState() {
    
        super.initState();
    
    
        DatabaseReference postsRef = FirebaseDatabase.instance.reference().child("Posts");
    
        postsRef.once().then((snap)
            {
    
          var keys = snap.snapshot.key;
          var values = snap.snapshot.value;
    
          postsList.clear();
    
          for (var individual in keys!) {
            Posts posts = Posts(
              values[individual]['url'],
              values[individual]['descrizione'],
              values[individual]['data'],
              values[individual]['ora'],
            );
            postsList.add(posts);
          }
    
    
          setState(()
          {
           print('Length : $postsList.length');
          });
    
        });
      }
    

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 2010-12-02
      • 1970-01-01
      • 2014-04-27
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      相关资源
      最近更新 更多