我的构建器中存在问题,导致在 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'],
);
}
}
所有这些函数都有返回值,所以我无法确定问题出在哪里。 能帮我解决一下吗?
我想这是因为你的第一个 if 在你的构建器中发生的。
您仅在以下情况下返回小部件:
if(snapshot.connectionState == ConnectionState.done)
条件为真。但如果没有,你什么也不做。如果连接状态未完成,则返回一个小部件。