Не удается обойти эти ошибки в flutter из-за нулевой безопасности

#flutter #dart #dart-null-safety

Вопрос:

Количество элементов: снимок.данные.длина, ошибка — К свойству «длина» нельзя получить безусловный доступ, потому что получатель может быть «нулевым». Попробуйте сделать доступ условным (используя»?.») или добавить нулевую проверку к цели («!»).

DocumentSnapshot sliderImage = снимок.данные[индекс]; ошибка-Метод «[] «не может быть вызван безоговорочно, потому что получатель может быть «нулевым». Попробуйте сделать вызов условным (используя»?») или добавить нулевую проверку к цели («!»).

Карта getImage = Слайд-изображение.данные();

ошибка — Значение типа «Объект?» не может быть присвоено переменной типа » Карта<динамическая, динамическая>». Попробуйте изменить тип переменной или присвоить правому типу значение » Сопоставить<динамический, динамический>».

 import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class ImageSlider extends StatefulWidget {
const ImageSlider({Key? key}) : super(key: key);

@override
_ImageSliderState createState() => _ImageSliderState();
}

class _ImageSliderState extends State<ImageSlider> {
Future getSliderImageFromDb() async {
var _fireStore = FirebaseFirestore.instance;
QuerySnapshot snapshot = await _fireStore.collection('slider').get();
return snapshot.docs;
}

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

@override
Widget build(BuildContext context) {
 return Column(
  children: [
    FutureBuilder(
      initialData: [], //remove later
      future: getSliderImageFromDb(),
      builder: (_, snapshot) {
        return snapshot.data == null
            ? Container()
            : CarouselSlider.builder(
                itemCount:
                    snapshot.data!.length,
                  itemBuilder: (context, int index, int pageIndex) {
                  DocumentSnapshot sliderImage = 
                  snapshot.data[index];
                  Map getImage = sliderImage.data();
                  return Image.network(getImage['image']);
                },
                options: CarouselOptions());
      },
    )
  ],
);
}
}
 

Комментарии:

1. Вы можете ознакомиться с безопасностью Null здесь

2. Можете ли вы предоставить часть своего исходного кода?

3. конечно, предоставьте это сейчас

Ответ №1:

Вам также необходимо указать универсальный тип FutureBuilder, например, скажем, если у вас есть список пользовательских моделей из БД, то это должно быть

  FutureBuilder<List<UserModel>>(
  initialData: [],
  future: getSliderImageFromDb(),
  builder: (_, List<UserModel> snapshot) {
    return Container();
  },
);
 

В Flutter2, если он может быть обнулен, вам нужно обработать его,
например, скажем, если список похож

Список<Модель пользователя?>? пользователи; // так как это может привести к аннулированию

Затем он возвращает модель пользователя, допускающую значение null, поэтому, если вы хотите назначить ее полям, не допускающим значения null, вам нужно обработать

 final String userName = users?.elementAtIndex(3)?.userName ?? 'N.A';
 

Или, если вы уверены, что это не нуль, вы можете

 final String userName = users!.elementAtIndex(3)!.userName;
 

Но если это значение равно нулю, оно создает исключение.

Ответ №2:

 snapshot.data.length
 

Здесь снимок.данные могут быть пустыми, поэтому безопасность null вызывает жалобы.Таким образом, вы убедитесь, что он никогда не будет равен нулю, проверив значение null следующим образом

 if(snapshot.data==null)
 return "Something Else"
 

затем убедитесь в безопасности null, что его значение никогда не будет равно нулю

 snapshot.data!.length
 

Комментарии:

1. Снимок.данные! .length затем выдает следующую ошибку, что получатель «длина» не определен для типа «Объект». Попробуйте импортировать библиотеку, которая определяет «длину», исправив имя на имя существующего метода получения или определив метод получения или поле с именем «длина».

2. пожалуйста, добавьте также свой код

3. ваш снимок.данные не являются списком, я думаю

4. я только что добавил код

5. снимок, а не снимок