Flutter Проверка Null safety

Помогите пожалуйста решить задачку. Ломаю голову как в данном случае поставить проверку на ноль, чтобы не перечила вложенным функциям. Проблема вылазит в строке

List < Post > posts = snapshot.data

!и? не подходят.

Widget build(BuildContext context) {
return  FutureBuilder(
      future: ipa.getAllPosts(),
      builder: (BuildContext context, AsyncSnapshot<List<Post>> snapshot) {
        
        List<Post>posts = snapshot.data;
        
        if (snapshot.hasError) {
          return Center(
              child: Column(
               children: [
                 CircularProgressIndicator(),
                 Text("Нет записей"),
            ],
           )
          );
        }
        
        if (snapshot.hasData) {
          return ListView(children: [
            SizedBox(height: 20),
            ...posts
                .map(
                  (p) =>
                  Column(
                    children: [
                      SizedBox(height: 20),
                      makeText('${p.caption}')
                    ],
                  ),
            )
                .toList()
          ]);
        }
      },
    );
 }

Ответы (1 шт):

Автор решения: ddo5
  • В строке List<Post> posts = snapshot.data; объявляете неверный тип. snapshot.data возвращает List<Post>?.
  • Если snapshot.hasData == true, то posts != null. А значит после проверки можно использовать оператор !: ...posts!.map. Но, мне кажется, понятнее, если вместо if (shapshot.hasData), сразу написать if (posts != null).

Полный код может выглядеть так:

Widget build2(BuildContext context) {
  return FutureBuilder(
    future: ipa.getAllPosts(),
    builder: (BuildContext context, AsyncSnapshot<List<Post>> snapshot) {
      final posts = snapshot.data;

      if (snapshot.hasError) {
        return Center(
          child: Column(
            children: [CircularProgressIndicator(), Text("Нет записей")],
          ),
        );
      }

      if (posts != null) {
        return ListView(children: [
          SizedBox(height: 20),
          ...posts
              .map(
                (p) => Column(
                  children: [SizedBox(height: 20), makeText('${p.caption}')],
                ),
              )
              .toList()
        ]);
      }
      
      return const Center(child: CircularProgressIndicator());
    },
  );
}
→ Ссылка