stats page pagina melhrar
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../Controllers/register_controller.dart';
|
||||
import '../controllers/register_controller.dart';
|
||||
import '../widgets/register_widgets.dart';
|
||||
import 'home.dart';
|
||||
|
||||
class RegisterPage extends StatefulWidget {
|
||||
const RegisterPage({super.key});
|
||||
@@ -11,67 +10,42 @@ class RegisterPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _RegisterPageState extends State<RegisterPage> {
|
||||
final RegisterController controller = RegisterController();
|
||||
// Instancia o controller
|
||||
final RegisterController _controller = RegisterController();
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
controller.dispose();
|
||||
_controller.dispose(); // Limpa a memória ao sair
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: Colors.white,
|
||||
// AppBar para poder voltar atrás
|
||||
appBar: AppBar(
|
||||
backgroundColor: Colors.white,
|
||||
elevation: 0,
|
||||
foregroundColor: Colors.black,
|
||||
),
|
||||
body: SafeArea(
|
||||
child: ListenableBuilder(
|
||||
listenable: controller,
|
||||
builder: (context, child) {
|
||||
return LayoutBuilder(
|
||||
// ... dentro do LayoutBuilder
|
||||
builder: (context, constraints) {
|
||||
final screenWidth = constraints.maxWidth;
|
||||
|
||||
return Center(
|
||||
child: SingleChildScrollView(
|
||||
child: Container(
|
||||
|
||||
width: screenWidth * 0.6,
|
||||
constraints: const BoxConstraints(minWidth: 320),
|
||||
padding: const EdgeInsets.all(32),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
const RegisterHeader(),
|
||||
const SizedBox(height: 40),
|
||||
|
||||
RegisterFormFields(controller: controller),
|
||||
const SizedBox(height: 32),
|
||||
|
||||
RegisterButton(
|
||||
controller: controller,
|
||||
onRegisterSuccess: () {
|
||||
Navigator.pushAndRemoveUntil(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => const HomeScreen()),
|
||||
(route) => false,
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
appBar: AppBar(title: const Text("Criar Conta")),
|
||||
body: Center(
|
||||
child: SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(24.0),
|
||||
child: ListenableBuilder(
|
||||
listenable: _controller, // Ouve as mudanças (loading)
|
||||
builder: (context, child) {
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
const Text(
|
||||
"Junta-te à Equipa!",
|
||||
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
|
||||
),
|
||||
const SizedBox(height: 30),
|
||||
|
||||
// Widgets Extraídos
|
||||
RegisterFormFields(controller: _controller),
|
||||
const SizedBox(height: 24),
|
||||
RegisterButton(controller: _controller),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
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';
|
||||
import 'package:playmaker/pages/teams_page.dart';
|
||||
// Certifica-te que o caminho do controller está correto:
|
||||
|
||||
class HomeScreen extends StatefulWidget {
|
||||
const HomeScreen({super.key});
|
||||
@@ -12,19 +13,20 @@ class HomeScreen extends StatefulWidget {
|
||||
|
||||
class _HomeScreenState extends State<HomeScreen> {
|
||||
int _selectedIndex = 0;
|
||||
|
||||
// 1. Instanciar o Controller para aceder ao Supabase
|
||||
final TeamController _teamController = TeamController();
|
||||
|
||||
// Lista de Widgets para cada aba
|
||||
// O IndexedStack vai alternar entre estes 4 widgets
|
||||
late final List<Widget> _pages;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_pages = [
|
||||
_buildHomeContent(), // Index 0
|
||||
const Center(child: Text('Tela de Jogo')), // Index 1
|
||||
const TeamsPage(), // Index 2 (TUA TELA DE EQUIPAS)
|
||||
const Center(child: Text('Tela de Status')), // Index 3
|
||||
_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
|
||||
];
|
||||
}
|
||||
|
||||
@@ -34,8 +36,6 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
});
|
||||
}
|
||||
|
||||
//home
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
@@ -50,7 +50,6 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
),
|
||||
),
|
||||
|
||||
// O IndexedStack mantém todas as páginas "vivas" mas só mostra uma
|
||||
body: IndexedStack(
|
||||
index: _selectedIndex,
|
||||
children: _pages,
|
||||
@@ -91,6 +90,65 @@ 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']);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildHomeContent() {
|
||||
return SingleChildScrollView(
|
||||
child: Padding(
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:playmaker/pages/home.dart';
|
||||
import 'package:playmaker/controllers/login_controller.dart';
|
||||
import '../widgets/login_widgets.dart';
|
||||
import '../../Controllers/login_controller.dart';
|
||||
import 'home.dart'; // <--- IMPORTANTE: Importa a tua HomeScreen
|
||||
|
||||
class LoginPage extends StatefulWidget {
|
||||
const LoginPage({super.key});
|
||||
@@ -34,9 +34,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
return Center(
|
||||
child: SingleChildScrollView(
|
||||
child: Container(
|
||||
// AGORA: Ocupa 60% da largura da tela, igual ao Register
|
||||
width: screenWidth * 0.6,
|
||||
// Garante que em telemóveis não fique demasiado apertado
|
||||
constraints: const BoxConstraints(minWidth: 340),
|
||||
padding: const EdgeInsets.all(32),
|
||||
child: Column(
|
||||
@@ -48,13 +46,17 @@ class _LoginPageState extends State<LoginPage> {
|
||||
LoginFormFields(controller: controller),
|
||||
const SizedBox(height: 24),
|
||||
|
||||
// AQUI ESTÁ A MUDANÇA PRINCIPAL
|
||||
LoginButton(
|
||||
controller: controller,
|
||||
onLoginSuccess: () {
|
||||
Navigator.pushReplacement(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => const HomeScreen()),
|
||||
);
|
||||
// Verifica se o widget ainda está no ecrã antes de navegar
|
||||
if (mounted) {
|
||||
Navigator.pushReplacement(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => const HomeScreen()),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
/*import 'package:flutter/material.dart';
|
||||
import 'package:playmaker/controllers/team_controllers.dart';
|
||||
import '../models/team_model.dart';
|
||||
import '../widgets/team_widgets.dart';
|
||||
@@ -13,7 +12,6 @@ class TeamsPage extends StatelessWidget {
|
||||
final TeamController controller = TeamController();
|
||||
|
||||
return Scaffold(
|
||||
body: StreamBuilder<QuerySnapshot>(
|
||||
stream: controller.teamsStream,
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasError) return const Center(child: Text('Erro ao carregar'));
|
||||
@@ -57,4 +55,4 @@ class TeamsPage extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
Reference in New Issue
Block a user