Typu "Null" nie jest podtypem "String" w flutter, firebase

0

Pytanie

Chcę wyświetlić dane tatausaha, ale za każdym razem, gdy wchodzę do systemu, pojawia się komunikat o błędzie "typ null nie jest podtypem typu string", choć używam polecenia w swoim modelu i w firebase. czy ktoś może mi pomóc?

to jest moja strona domowa.dart

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

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

class _HomePageState extends State<HomePage> {
  @override
  void initState() {
    context.read<TataUsahaCubit>().fetchTataUsaha();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    Widget header() {
      return BlocBuilder<AuthCubit, AuthState>(
        builder: (context, state) {
          if (state is AuthSuccess) {
            return Container(
              margin: EdgeInsets.only(
                  right: defaultMargin, left: defaultMargin, top: 30),
              child: Row(
                children: [
                  Expanded(
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Text(
                          'Hay,\n${state.user.name}',
                          style: blackTextStyle.copyWith(
                            fontSize: 24,
                            fontWeight: semiBold,
                          ),
                          overflow: TextOverflow.ellipsis,
                        ),
                        Text(
                          'Ingin Melihat Guru kamu?',
                          style: greyTextStyle.copyWith(
                            fontSize: 16,
                            fontWeight: light,
                          ),
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            );
          } else {
            return SizedBox();
          }
        },
      );
    }

    Widget kepalaSekolah() {
      return Container(
        margin: EdgeInsets.only(
          left: defaultMargin,
          right: defaultMargin,
          top: 30,
        ),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'Kepala Sekolah',
              style: blackTextStyle.copyWith(
                fontSize: 18,
                fontWeight: semiBold,
              ),
            ),
            KepalaSekolahTile(
              name: 'Charles Marsel Palasa, S.Pd.',
              imageUrl: 'assets/kepala_sekolah.jpeg',
              jabatan: 'Kepala Sekolah',
            ),
          ],
        ),
      );
    }

    Widget tataUsaha(List<TataUsahaModel> tatausahah) {
      return Container(
        margin: EdgeInsets.only(
          left: defaultMargin,
          right: defaultMargin,
          top: 20,
        ),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'Tata Usaha',
              style: blackTextStyle.copyWith(
                fontSize: 18,
                fontWeight: semiBold,
              ),
            ),
            Column(
              children: tatausahah.map((TataUsahaModel tatausaha) {
                return TataUsahaTile(tatausaha);
              }).toList(),
            ),
          ],
        ),
      );
    }

    return BlocConsumer<TataUsahaCubit, TataUsahaState>(
        listener: (context, state) {
      if (state is TataUsahaFailed) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            backgroundColor: kRedColor,
            content: Text(state.error),
          ),
        );
      }
    }, builder: (context, state) {
      if (state is TataUsahaSuccess) {
        return ListView(
          children: [
            header(),
            kepalaSekolah(),
            tataUsaha(state.tatausahah),
          ],
        );
      }
      return Center(
        child: CircularProgressIndicator(
          color: kPrimaryColor,
        ),
      );
    });
  }
}

тата_усаха_кубит.dart

part 'tata_usaha_state.dart';

class TataUsahaCubit extends Cubit<TataUsahaState> {
  TataUsahaCubit() : super(TataUsahaInitial());
  void fetchTataUsaha() async {
    try {
      emit(TataUsahaLoading());

      List<TataUsahaModel> tatausahah =
          await TataUsahaService().fetchTataUsaha();
      emit(TataUsahaSuccess(tatausahah));
    } catch (e) {
      emit(TataUsahaFailed(e.toString()));
    }
  }
}

tata_usaha_state.dart

part of 'tata_usaha_cubit.dart';

abstract class TataUsahaState extends Equatable {
  const TataUsahaState();

  @override
  List<Object> get props => [];
}

class TataUsahaInitial extends TataUsahaState {}

class TataUsahaLoading extends TataUsahaState {}

class TataUsahaSuccess extends TataUsahaState {
  final List<TataUsahaModel> tatausahah;
  TataUsahaSuccess(this.tatausahah);
  @override
  List<Object> get props => [tatausahah];
}

class TataUsahaFailed extends TataUsahaState {
  final String error;
  TataUsahaFailed(this.error);
  @override
  List<Object> get props => [error];
}

tata_usaha_модель.dart

import 'package:equatable/equatable.dart';

class TataUsahaModel extends Equatable {
  final String id;
  final String name;
  final String tahunMasuk;
  final String posisi;
  final String quotes;
  final String imageUrl;

  TataUsahaModel({
    required this.id,
    this.name = '',
    this.tahunMasuk = '',
    this.posisi = '',
    this.quotes = '',
    this.imageUrl = '',
  });

  factory TataUsahaModel.fromJson(String id, Map<String, dynamic> json) =>
      TataUsahaModel(
        id: id,
        name: json['name'],
        tahunMasuk: json['tahunMasuk'],
        posisi: json['posisi'],
        quotes: json['qoutes'],
        imageUrl: json['imageUrl'],
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'name': name,
        'tahunMasuk': tahunMasuk,
        'posisi': posisi,
        'quotes': quotes,
        'imageUrl': imageUrl,
      };

  @override
  List<Object?> get props => [
        id,
        name,
        tahunMasuk,
        posisi,
        quotes,
        imageUrl,
      ];
}

tata_usaha_service.dart

class TataUsahaService {
  CollectionReference _tatausahaRef =
      FirebaseFirestore.instance.collection('tatausaha');

  Future<List<TataUsahaModel>> fetchTataUsaha() async {
    try {
      QuerySnapshot result = await _tatausahaRef.get();

      List<TataUsahaModel> tatausaha = result.docs.map((e) {
        return TataUsahaModel.fromJson(e.id, e.data() as Map<String, dynamic>);
      }).toList();
      print(tatausaha);
      return tatausaha;
    } catch (e) {
      throw e;
    }
  }
}
firebase flutter
2021-11-24 01:16:08
2
0

Proszę sprawdzić swoje komunikat o błędzie podczas tworzenia aplikacji.

Nie wiem dokładnie, gdzie dokładnie, ale tam próbują rozebrać wiersz od podstaw.

Zakładam, że problem leży w poniższej części. (Nie jestem pewien)

Text(
   'Hay,\n${state.user.name}',

Wydrukuj 'state.user.name-zanim go użyjesz.

I postaw warunek, aby tego uniknąć.

2021-11-24 01:54:41

to może być wyświetlony, co prowadzi do błędu w dziale татаУсаха()
muhammad alam nur haris
0

Należy w tym momencie wyzerować bezpieczeństwo. Na przykład, można zadeklarować nazwę paska, a następnie

name: json['name'] ?? ''; // default if null name will be set to empty

na inny sposób: zadeklarować nazwę zmiennej jako ciąg? // ? oznacza to, że może być równa zero.

lub bardziej dokładnie

name: (json['name'] ?? '').toString();
// eventhough server/firebase return wrong type such as Bool not String, your code will not be through exception wrong type casting.
2021-11-24 03:00:10

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................