dart Flutter:避免将`forEach`与函数字面量一起使用

yqhsw0fo  于 2023-11-14  发布在  Flutter
关注(0)|答案(3)|浏览(318)

大家好,这是我的整个方法:

Future<void> init() async {
    FirebaseAuth.instance.userChanges().listen((user) {
      if (user != null) {
        _loginState = ApplicationLoginState.loggedIn;
        _guestBookSubscription = FirebaseFirestore.instance
            .collection('guestbook')
            .orderBy('timestamp', descending: true)
            .limit(3)
            .snapshots()
            .listen((snapshot) {
          _guestBookMessages = [];
          snapshot.docs.forEach((document) {
            _guestBookMessages.add(
              GuestBookMessage(
                name: document.data()['name'] as String,
                message: document.data()['text'] as String,
              ),
            );
          });
          notifyListeners();
        });
      } else {
        _loginState = ApplicationLoginState.loggedOut;
        _guestBookMessages = [];
        _guestBookSubscription?.cancel();
      }
      notifyListeners();
    });
  }

字符串
dart 抱怨的部分是这样的:

snapshot.docs.forEach((document) {
            _guestBookMessages.add(
              GuestBookMessage(
                name: document.data()['name'] as String,
                message: document.data()['text'] as String,
              ),
            );
          });


我怎样才能在不破坏整个功能的情况下改变这个方法呢?我只是在寻找一种让dart高兴的方法。

mwngjboj

mwngjboj1#

避免将forEach与函数字面量一起使用。

避免:

snapshot.docs.forEach((document) {
  ...
});

字符串

好:

for (var document in snapshot.docs) {
  // Rest of your code
}

iklwldmw

iklwldmw2#

data.forEach(function);为例:

void main() async {
  List<int> list = [1, 2, 3, 4, 5];

  //recommended
  list.forEach(showSquareNumbers);

  //not recommended
  list.forEach((int number) => showSquareNumbers(number));
  list.forEach((int number) {
    showSquareNumbers(number);
  });
}

void showSquareNumbers(int data) {
  print("$data * $data = ${data * data}");
}

字符串

这是我的意见

我认为forEach似乎比for循环更复杂,forEach不能使用continuebreakreturn可用,但使用return时不会发生任何事情)。

void test(List data) {
  data.forEach((element) {
    print(element);
    if(element) return;
  });

  for (var element in data) {
    print(element);
    if(element) continue;
    if(element) break;
    if(element) return;
  }
}


我认为当你的forEach循环看起来像下面的代码时,我们应该使用for而不是forEach循环,因为正如我所说,for循环比forEach有更多的选项。

data.forEach((element) {
    print(element)
  });
  //or
  data.forEach((element) => print(element));


我认为forEach循环用于简短的代码(易于理解),当你想做一些你不关心结果的事情时,就像这段代码(与Function(dynamic)一起使用)。

void test(List data) {
  void showInTerminal(e) {
    print("data is $e");
  }
  data.forEach(showInTerminal);
  
  Function(dynamic) function = showInTerminal;
  data.forEach(function);
}


确保数据类型和函数(类型)相同。

//error
void test(List<Map> data) {
  void showInTerminal(String e) {
    print("data is $e");
  }
  data.forEach(showInTerminal);
}

//success
void test(List<Map> data) {
  void showInTerminal(Map e) {
    print("data is $e");
  }
  data.forEach(showInTerminal);
}


我是这样写的。我觉得很容易读懂。

void test() {
  dataList.forEach(removeData);
  fileList.forEach(removeFile);
}

xkftehaa

xkftehaa3#

使用await for

await for (final document in snapshot.docs) {
  // Your code...
}

字符串

相关问题