Flutter - Gerenciando uma ListView

De Aulas
Revisão de 17h32min de 3 de março de 2023 por Admin (discussão | contribs)

Afluentes: Dispositivos Móveis; Usabilidade, desenvolvimento web, mobile e jogos

main.dart

import 'package:flutter/material.dart';
import 'mycontacts.dart';

void main() => runApp(const App());

class App extends StatelessWidget {
  const App({super.key});

  @override
  build(context) {
    return const MaterialApp(
      title: 'Contatos',
      home: MyContacts(),
    );
  }
}

contacts.dart

class Contact {
  final int id;
  final String name;
  final String phone;

  Contact({
    required this.id,
    required this.name,
    required this.phone,
  });

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'phone': phone,
    };
  }

  @override
  String toString() {
    return '$id $name $phone';
  }
}

mycontacts.dart

  1import 'package:flutter/material.dart';
  2import 'contact.dart';
  3
  4class MyContacts extends StatefulWidget {
  5  const MyContacts({super.key});
  6
  7  @override
  8  State<MyContacts> createState() => _MyContactsState();
  9}
 10
 11class _MyContactsState extends State<MyContacts> {
 12  var contacts = [];
 13  int _id = -1;
 14  int _index = -1;
 15  final TextEditingController _name = TextEditingController();
 16  final TextEditingController _phone = TextEditingController();
 17
 18  _MyContactsState() {
 19    contacts.add(Contact(id: 1, name: 'Saulo', phone: '77777'));
 20    contacts.add(Contact(id: 2, name: 'Pati', phone: '88888'));
 21    contacts.add(Contact(id: 3, name: 'Arisa', phone: '999999'));
 22  }
 23
 24  @override
 25  Widget build(BuildContext context) {
 26    return Scaffold(
 27      appBar: AppBar(
 28        title: const Text("Agenda"),
 29      ),
 30      body: Column(
 31        children: [
 32          TextField(
 33            decoration: const InputDecoration(
 34              labelText: 'Nome',
 35            ),
 36            controller: _name,
 37          ),
 38          TextField(
 39            decoration: const InputDecoration(
 40              labelText: 'Telefone',
 41            ),
 42            controller: _phone,
 43          ),
 44          Row(
 45            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
 46            children: [
 47              ElevatedButton(
 48                child: const Text('Gravar'),
 49                onPressed: () {
 50                  if (_name.text.trim() != '') {
 51                    var c = Contact(
 52                      id: 0,
 53                      name: _name.text,
 54                      phone: _phone.text,
 55                    );
 56                    setState(() {
 57                      contacts.add(c);
 58                    });
 59                  }
 60                },
 61              ),
 62              ElevatedButton(
 63                style: ElevatedButton.styleFrom(
 64                  foregroundColor: Colors.white,
 65                  backgroundColor: Colors.red,
 66                ),
 67                child: const Text('Excluir'),
 68                onPressed: () {
 69                  setState(() {
 70                    if (_index != -1) {
 71                      contacts.removeAt(_index);
 72                    }
 73                  });
 74                },
 75              ),
 76              ElevatedButton(
 77                style: ElevatedButton.styleFrom(
 78                  foregroundColor: Colors.white,
 79                  backgroundColor: Colors.green,
 80                ),
 81                child: const Text('Limpar'),
 82                onPressed: () {
 83                  setState(() {
 84                    _index = -1;
 85                    _id = -1;
 86                    _name.text = "";
 87                    _phone.text = "";
 88                  });
 89                },
 90              ),
 91            ],
 92          ),
 93          // Expanded é pra rolar a lista
 94          Expanded(
 95            child: ListView.builder(
 96              shrinkWrap: true,
 97              itemCount: contacts.length,
 98              itemBuilder: (context, index) {
 99                return ListTile(
100                  title: Text(
101                    contacts[index].name,
102                    style: const TextStyle(
103                      fontSize: 20.0,
104                      color: Colors.black,
105                    ),
106                  ),
107                  subtitle: Text(contacts[index].phone),
108                  onTap: () {
109                    setState(() {
110                      _index = index;
111                      _id = contacts[index].id;
112                      _name.text = contacts[index].name;
113                      _phone.text = contacts[index].phone;
114                    });
115                  },
116                );
117              },
118            ),
119          ),
120        ],
121      ),
122    );
123  }
124}


Atividades

Desafio 1

BUSCA ATIVA: Siga os exemplos apresentados de listas e consumo de api passo a passo e faça-os funcionar. Faça modificações no código para entender o funcionamento e como adicionar novos elementos.


Tplnote Bulbgraph.png

Atividade individual.

Desafio 2

Desenvolva um aplicativo em Flutter com as seguintes características:

  • Desenvolva um aplicativo com listView estilo o que foi feito em aula;
  • Adicione mais campos;
  • Tente colocar uma imagem nos itens;
  • Ao invéz de um botão para excluir, use o Clique longo para apagar um item, mas peça confirmação antes.
  • Tente utilizar alguns outros elementos não vistos em aula.


Tplnote Bulbgraph.png

Atividade em grupo de até 4 integrantes.