import ‘package:flutter/material.dart’;
void main() {
runApp(
MaterialApp(
debugShowCheckedModeBanner: false,
home: HomeMain(),
),
);
}
class HomeMain extends StatefulWidget {
@override
HomeMainState createState() => HomeMainState();
}
class HomeMainState extends State<HomeMain> {
int itemSelecionado = 0;
List<Map<String, String>> listaDados = [];
int? indexEditando;
void salvarDados(Map<String, String> novosDados) {
setState(() {
if (indexEditando == null) {
listaDados.add(novosDados);
} else {
listaDados[indexEditando!] = novosDados;
indexEditando = null;
}
itemSelecionado = 0;
});
}
void editarItem(int index) {
setState(() {
indexEditando = index;
itemSelecionado = 1;
});
}
void deletarItem(int index) {
setState(() {
listaDados.removeAt(index);
});
}
@override
Widget build(BuildContext context) {
final pages = [
HomePage(
dados: listaDados,
onEditar: editarItem,
onDeletar: deletarItem,
),
RegisterPage(
onSalvar: salvarDados,
dadosEdicao:
indexEditando != null ? listaDados[indexEditando!] : null,
),
];
return Scaffold(
backgroundColor: Color(0xFFf8f3e9),
appBar: AppBar(
backgroundColor: Color(0xFFf8f3e9),
title: Center(child: Text(“Terra Viva”)),
),
body: IndexedStack(
index: itemSelecionado,
children: pages,
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: itemSelecionado,
onTap: (valor) {
setState(() {
itemSelecionado = valor;
});
},
items: const [
BottomNavigationBarItem(icon: Icon(Icons.home), label: ‘Home’),
BottomNavigationBarItem(
icon: Icon(Icons.app_registration), label: ‘Cadastrar’),
],
),
);
}
}
/* ========================= HOME ========================= */
class HomePage extends StatelessWidget {
final List<Map<String, String>> dados;
final Function(int index) onEditar;
final Function(int index) onDeletar;
HomePage({
required this.dados,
required this.onEditar,
required this.onDeletar,
});
@override
Widget build(BuildContext context) {
return Column(
children: [
Container(
height: 250,
width: double.infinity,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Color(0xFF5E4638), Color(0xFF5E4638)],
),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(30),
bottomRight: Radius.circular(30),
),
),
child: Padding(
padding: EdgeInsets.fromLTRB(16, 60, 16, 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(“Raízes Vivas”,
style: TextStyle(color: Colors.white)),
SizedBox(height: 10),
Text(
“Conecte-se\ncom nossas\nraízes”,
style: TextStyle(
fontSize: 26,
fontWeight: FontWeight.bold,
color: Color.fromARGB(255, 255, 255, 255),
),
),
SizedBox(height: 10),
Text(
“Informação, cultura e território na palma da sua mão.”,
style: TextStyle(color: Colors.white),
),
],
),
),
),
Expanded(
child: dados.isEmpty
? Center(child: Text(“Nenhum dado foi cadastrado”))
: ListView.builder(
itemCount: dados.length,
itemBuilder: (context, index) {
final item = dados[index];
return Card(
margin: EdgeInsets.all(10),
child: Padding(
padding: EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item[‘territorio’] ?? ”,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold),
),
Text(“Povo: ${item[‘povo’] ?? ”}”),
Text(“Local: ${item[‘localizacao’] ?? ”}”),
Text(“Data: ${item[‘data’] ?? ”}”),
Text(“Descrição:\n${item[‘descricao’] ?? ”}”),
SizedBox(height: 10),
Row(
children: [
ElevatedButton(
onPressed: () => onEditar(index),
child: Text(“Editar”),
),
SizedBox(width: 10),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Color(0xFF337357),
),
onPressed: () => onDeletar(index),
child: Text(“Excluir”, style: TextStyle(color: Colors.white)),
),
],
)
],
),
),
);
},
),
)
],
);
}
}
/* ========================= FORM ========================= */
class RegisterPage extends StatefulWidget {
final Function(Map<String, String>) onSalvar;
final Map<String, String>? dadosEdicao;
const RegisterPage({
required this.onSalvar,
this.dadosEdicao,
super.key,
});
@override
RegisterPageState createState() => RegisterPageState();
}
class RegisterPageState extends State<RegisterPage> {
final territorioController = TextEditingController();
final povoController = TextEditingController();
final localizacaoController = TextEditingController();
final dataController = TextEditingController();
final descricaoController = TextEditingController();
@override
void initState() {
super.initState();
final d = widget.dadosEdicao;
if (d != null) {
territorioController.text = d[‘territorio’] ?? ”;
povoController.text = d[‘povo’] ?? ”;
localizacaoController.text = d[‘localizacao’] ?? ”;
dataController.text = d[‘data’] ?? ”;
descricaoController.text = d[‘descricao’] ?? ”;
}
}
Map<String, String> salvarInfo() {
return {
‘territorio’: territorioController.text,
‘povo’: povoController.text,
‘localizacao’: localizacaoController.text,
‘data’: dataController.text,
‘descricao’: descricaoController.text,
};
}
@override
Widget build(BuildContext context) {
final isEdit = widget.dadosEdicao != null;
return SingleChildScrollView(
child: Column(
children: [
Container(
height: 150,
width: double.infinity,
color: Color(0xFF8AA06A),
child: Center(
child: Text(
isEdit ? “Editar território” : “Novo território”,
style: TextStyle(color: Colors.white, fontSize: 22),
),
),
),
Padding(
padding: EdgeInsets.all(16),
child: Column(
children: [
TextField(
controller: territorioController,
decoration:
InputDecoration(labelText: “Nome do território”),
),
TextField(
controller: povoController,
decoration:
InputDecoration(labelText: “Povo indígena”),
),
TextField(
controller: localizacaoController,
decoration: InputDecoration(labelText: “Localização”),
),
TextField(
controller: dataController,
decoration:
InputDecoration(labelText: “Data de reconhecimento”),
),
TextField(
controller: descricaoController,
decoration: InputDecoration(labelText: “Descrição”),
),
SizedBox(height: 20),
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () {
widget.onSalvar(salvarInfo());
},
child: Text(isEdit ? “Atualizar” : “Cadastrar”),
),
)
],
),
)
],
),
);
}
}
Deixe um comentário