continuar a team_page

This commit is contained in:
2026-01-27 17:17:31 +00:00
parent d7742432f4
commit dc3a9723a4
10 changed files with 469 additions and 472 deletions

View File

@@ -1,8 +1,7 @@
import 'package:flutter/material.dart';
import 'package:playmaker/classe/home.config.dart';
import 'package:playmaker/controllers/team_controllers.dart';
import 'package:playmaker/grafico%20de%20pizza/grafico.dart';
// Certifica-te que o caminho do controller está correto:
import 'package:playmaker/pages/teamPage.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@@ -13,9 +12,7 @@ class HomeScreen extends StatefulWidget {
class _HomeScreenState extends State<HomeScreen> {
int _selectedIndex = 0;
// 1. Instanciar o Controller para aceder ao Supabase
final TeamController _teamController = TeamController();
late final List<Widget> _pages;
@@ -23,10 +20,10 @@ class _HomeScreenState extends State<HomeScreen> {
void initState() {
super.initState();
_pages = [
_buildHomeContent(), // Index 0: Home
const Center(child: Text('Tela de Jogo')), // Index 1: Jogo
_buildTeamsContent(), // Index 2: Equipas (O teu StreamBuilder entra aqui)
const Center(child: Text('Tela de Status')), // Index 3: Status
_buildHomeContent(),
const Center(child: Text('Tela de Jogo')),
const TeamsPage(),
const Center(child: Text('Tela de Status')),
];
}
@@ -90,64 +87,8 @@ class _HomeScreenState extends State<HomeScreen> {
// --- WIDGETS DE CONTEÚDO ---
// 2. O teu StreamBuilder foi movido para aqui
Widget _buildTeamsContent() {
return StreamBuilder<List<Map<String, dynamic>>>(
stream: _teamController.teamsStream,
builder: (context, snapshot) {
// Verificar estado de carregamento
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
}
// Verificar erros ou lista vazia
if (snapshot.hasError) {
return Center(child: Text("Erro: ${snapshot.error}"));
}
if (!snapshot.hasData || snapshot.data!.isEmpty) {
return const Center(child: Text("Ainda não tens equipas."));
}
// Obter dados (Lista simples do Supabase)
final teams = snapshot.data!;
return ListView.builder(
padding: const EdgeInsets.all(16),
itemCount: teams.length,
itemBuilder: (context, index) {
final team = teams[index];
// Construção do Card da Equipa
return Card(
elevation: 2,
margin: const EdgeInsets.only(bottom: 12),
child: ListTile(
leading: CircleAvatar(
backgroundColor: HomeConfig.primaryColor,
child: Text(
team['name'][0].toUpperCase(),
style: const TextStyle(color: Colors.white),
),
),
title: Text(
team['name'],
style: const TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Text("Época: ${team['season']}"),
trailing: IconButton(
icon: const Icon(Icons.delete, color: Colors.red),
onPressed: () {
// Confirmação antes de apagar (Opcional, mas recomendado)
_teamController.deleteTeam(team['id']);
},
),
),
);
},
);
},
);
}
// REMOVIDO: Widget _buildTeamsContent()...
// Motivo: Este código foi movido para dentro de lib/pages/teams_page.dart
Widget _buildHomeContent() {
return SingleChildScrollView(

84
lib/pages/teamPage.dart Normal file
View File

@@ -0,0 +1,84 @@
import 'package:flutter/material.dart';
import '../controllers/team_controller.dart';
import '../models/team_model.dart';
import '../widgets/team_widgets.dart';
class TeamsPage extends StatefulWidget {
const TeamsPage({super.key});
@override
State<TeamsPage> createState() => _TeamsPageState();
}
class _TeamsPageState extends State<TeamsPage> {
final TeamController controller = TeamController();
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFFF5F7FA),
// Título simples no topo (opcional, já tens a BottomNavBar)
// appBar: AppBar(title: Text("Minhas Equipas"), automaticallyImplyLeading: false),
body: StreamBuilder<List<Map<String, dynamic>>>(
stream: controller.teamsStream,
builder: (context, snapshot) {
// Estado de Loading
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
}
// Estado Vazio
if (!snapshot.hasData || snapshot.data!.isEmpty) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Icon(Icons.sports_basketball_outlined, size: 60, color: Colors.grey),
SizedBox(height: 16),
Text(
'Ainda não tens equipas.',
style: TextStyle(color: Colors.grey, fontSize: 16),
),
Text(
'Clica no + para criar.',
style: TextStyle(color: Colors.grey, fontSize: 14),
),
],
),
);
}
final teamsData = snapshot.data!;
// Lista de Equipas
return ListView.builder(
padding: const EdgeInsets.all(16),
itemCount: teamsData.length,
itemBuilder: (context, index) {
final team = Team.fromMap(teamsData[index]);
return TeamCard(team: team, controller: controller);
},
);
},
),
// --- O BOTÃO FLUTUANTE QUE PEDISTE ---
floatingActionButton: FloatingActionButton(
onPressed: () {
showDialog(
context: context,
builder: (context) => CreateTeamDialog(
onConfirm: (name, season, imageUrl) {
controller.createTeam(name, season, imageUrl);
},
),
);
},
backgroundColor: const Color(0xFFE74C3C), // Cor Vermelha
child: const Icon(Icons.add, color: Colors.white),
),
);
}
}

View File

@@ -1,58 +0,0 @@
/*import 'package:flutter/material.dart';
import 'package:playmaker/controllers/team_controllers.dart';
import '../models/team_model.dart';
import '../widgets/team_widgets.dart';
class TeamsPage extends StatelessWidget {
const TeamsPage({super.key});
@override
Widget build(BuildContext context) {
// Instância única do controlador para esta página
final TeamController controller = TeamController();
return Scaffold(
stream: controller.teamsStream,
builder: (context, snapshot) {
if (snapshot.hasError) return const Center(child: Text('Erro ao carregar'));
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
}
final docs = snapshot.data!.docs;
if (docs.isEmpty) return const Center(child: Text('Nenhuma equipa criada.'));
return ListView.builder(
padding: const EdgeInsets.all(16),
itemCount: docs.length,
itemBuilder: (context, index) {
final team = Team.fromFirestore(
docs[index].data() as Map<String, dynamic>,
docs[index].id
);
// CORREÇÃO 1: Passar o team E o controller para o Card
return TeamCard(team: team, controller: controller);
},
);
},
),
floatingActionButton: FloatingActionButton(
backgroundColor: const Color(0xFFE74C3C),
child: const Icon(Icons.add, color: Colors.white),
onPressed: () {
showDialog(
context: context,
builder: (context) => CreateTeamDialog(
// CORREÇÃO 2: Receber os 3 parâmetros do formulário
onConfirm: (name, season, imageUrl) {
// Passar os 3 para a função do controlador
controller.createTeam(name, season, imageUrl);
},
),
);
},
),
);
}
}*/