Flutter - Gerenciando uma ListView

De Aulas
Revisão de 09h53min de 8 de maio de 2021 por Admin (discussão | contribs)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)

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

main.dart

 1import 'package:flutter/material.dart';
 2import 'mycontacts.dart';
 3
 4void main() => runApp(App());
 5
 6class App extends StatelessWidget {
 7  @override
 8  build(context) {
 9    return MaterialApp(
10      title: 'Contatos',
11      home: MyContacts(),
12    );
13  }
14}

contacts.dart

 1class Contact {
 2  final int id;
 3  final String name;
 4  final String phone;
 5
 6  Contact({
 7    this.id,
 8    this.name,
 9    this.phone,
10  });
11
12  Map<String, dynamic> toMap() {
13    return {
14      'id': id,
15      'name': name,
16      'phone': phone,
17    };
18  }
19
20  @override
21  String toString() {
22    return '$id $name $phone';
23  }
24}

mycontacts.dart

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


Atividades

Desafio 1

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:

  • Utilize uma outra API para buscar dados
  • A janela inicial deve conter informações para usar na API e retornar o resultado quando clicar em um botão
  • O resultado é apresentado em uma nova janela, na forma de lista
  • Quando clica em algum ítem da lista, abre uma terceira janela com mais informações sobre o item clicado
  • Tente utilizar alguns outros elementos não vistos em aula.


Tplnote Bulbgraph.png

Atividade em grupo de até 4 integrantes.