Flutter / Builder 不应返回 null

问题描述 投票:0回答:1

我的构建器中存在问题,导致在 match_page.dart 中的构建器之后出现以下错误: “主体可能会正常完成,导致返回“null”,但返回类型“Widget”可能是不可为 null 的类型。 尝试在末尾添加 return 或 throw 语句。”

主页中的代码:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:love_app/components/models/user.dart';
import 'package:love_app/components/repository/userRepository.dart';
import 'package:love_app/controllers/profile_controller.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:get/get.dart';


class MainPage extends StatelessWidget {
  const MainPage({super.key});
  void signUserOut(){
    FirebaseAuth.instance.signOut();
  }

  @override
  Widget build(BuildContext context) {

    final controller = Get.put(ProfileController());
    return Scaffold(
      body: SingleChildScrollView(
        child: FutureBuilder<List<UserModel>>(
          future: controller.getAllUser(),
          builder: (context, snapshot) {
            if(snapshot.connectionState == ConnectionState.done){
              if(snapshot.hasData){

              // UserModel userData = snapshot.data as UserModel;

                return GridView.count(
                crossAxisCount: 2,
                children: List.generate(snapshot.data!.length, (index) {
                return Center(
                    child: Column(
                        children: [
                           Center(
                            child: Container(
                            padding: const EdgeInsets.all(8),
                            decoration: BoxDecoration(
                              color: Colors.black.withOpacity(0.04),
                              borderRadius: const BorderRadius.all(Radius.circular(16)),
                              
                            ),
                            height: 185,
                            width: 185,
                            margin:EdgeInsets.all(5.0)
                          ),
                          ),
                          
                          Stack(
                            children: [
                                ListTile(
                                  iconColor: Colors.blue,
                                  tileColor: Colors.blue.withOpacity(0.1),
                                  title: Text("Pseudo: ${snapshot.data![index].pseudo}"),
                                  subtitle: Column(crossAxisAlignment: CrossAxisAlignment.start,
                                  children: [Text("Nom: ${snapshot.data![index].nom}"),
                                  Text("Prénom: ${snapshot.data![index].prenom}"),
                                  Text("Description: ${snapshot.data![index].description}"),
                                  Text("Passions: ${snapshot.data![index].passions}")
                                  ]
                                )
                              )   ],
                          )
                          
                        ],),
                    
                  );
                }
            ),
          );
  }
  else if (snapshot.hasError) {
  print("Snapshot data: ${snapshot.data}");
  return const SizedBox(
  width: 200.0,
  height: 300.0,
  child: Card(child: Text('Passe dans else du erreur!')),
);}
else { 
  print("Snapshot data: ${snapshot.data}");
  return const SizedBox(
  width: 200.0,
  height: 300.0,
  child: Card(child: Text('Passe dans else du has data!')));}}})));}}

要从 Firestore 中的“Utilisateur”集合中查找用户信息,我使用 userRepository.dart :

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:love_app/components/models/user.dart';

class UserRepository extends GetxController {
  static UserRepository get instance => Get.find();

  final _db = FirebaseFirestore.instance;

Future<UserModel> getUserDetails(String id) async {
  final snapshot = await _db.collection("Utilisateur").where("id", isEqualTo: id).get();
  final userData = snapshot.docs.map((e) => UserModel.fromSnapshot(e)).single;
  return userData;
}

Future<List<UserModel>> allUser() async {
  final snapshot = await _db.collection("Utilisateur").get();
  final userData = snapshot.docs.map((e) => UserModel.fromSnapshot(e)).toList();
  return userData;
}

}

我也使用这个 profile_controller.dart:

import 'package:get/get.dart';
import 'package:love_app/components/repository/userRepository.dart';
import 'package:love_app/components/models/user.dart';

class ProfileController extends GetxController {
  static ProfileController get instance => Get.find();

  final _userRepo = Get.put(UserRepository());

Future<UserModel> getUserData() {
    const id = "9uVSkDP4Twqh0FWCekXV";
    // TODo: essayer de récupérer l'id du user connecté
    return _userRepo.getUserDetails(id);

  }


Future<List<UserModel>> getAllUser() async {
  return await _userRepo.allUser();
}
}

我的用户.dart:

import 'package:cloud_firestore/cloud_firestore.dart';

class UserModel {

  final String id;
  final String description;
  final String nom;
  final String passions;
  final String prenom;
  final String pseudo;

  const UserModel({
    required this.id, 
    required this.description, 
    required this.nom, 
    required this.passions, 
    required this.prenom, 
    required this.pseudo, 

 toJson() {
  return { "Description" : description, "Nom": nom, "Passions": passions,
  "Prenom": prenom , "Pseudo": pseudo};
 }

factory UserModel.fromSnapshot(DocumentSnapshot<Map<String, dynamic>> document) {
  final data = document.data()!;
  return UserModel (
    id: document.id,
    description: data['Description'],
    nom: data['Nom'],
    passions: data['Passions'],
    prenom: data['Prenom'],
    pseudo: data['Pseudo'],
  );
}

}

所有这些函数都有返回值,所以我无法确定问题出在哪里。 能帮我解决一下吗?

flutter google-cloud-firestore widget builder snapshot
1个回答
0
投票

我想这是因为你的第一个 if 在你的构建器中发生的。

您仅在以下情况下返回小部件:

if(snapshot.connectionState == ConnectionState.done)
条件为真。但如果没有,你什么也不做。如果连接状态未完成,则返回一个小部件。

© www.soinside.com 2019 - 2024. All rights reserved.