Aplicativo mobile híbrido para o calculo do Índice de Massa Corporal (IMC). Armazenando informações como altura, peso, idade, sexo e status. Para criar esse projeto foi utilizado a linguagem Dart e o framework Flutter. Como o objetivo da aplicação era treinar a persistência de dados localmente com FLutter, por isso foi criado uma classe abstrata chamada ImcRepository onde contém os principais métodos da aplicação e são implementadas nas classes HiveImcModel e SqfliteImcModel, que utiliza o banco NoSQL Hive e SQL SQFlite.
- Calcular IMC:Realizar o calculo do imc com base nas informações selecionadas em cada componente.
- Alert Dialog:Uso do Widget AlertDialog para gerar avisos e receber informações.
- Calculo do Peso ideal:Usando um método na class ImcModel para calcular o intervalo entre o peso mínimo e máximo do peso ideal.
- Modal com o resultado:Uso do Widget showModalBottomSheet para apresentar o resultado do Imc.
- Filtro de pesquisa:Listagem das leituras salvas filtrando o status do Imc.
- Persistência de dados:Uso do package Hive e SQFlite para persistência dos dados.
- Criação de um Adapter:Criação de um Adapter para o ImcModel com auxílio do Hive Generator e o Build Runner.
- Fácil navegação: Uso dos Widgets PageView e BottomNavigationBar para uma fácil navegação entre as telas.
O Hive é um banco de dados local do tipo chave-valor leve e muito rápido, adaptado para todas as plataformas suportadas pelo Flutter, Ele se utiliza do conceito de caixas, sendo que uma caixa não possuem uma estrutura fixa e podem conter qualquer tipo de dado que o programador desejar.
//Um exemplo de como iniciar uma caixa com o Hive
Future iniciarCaixa() async {
if (Hive.isBoxOpen('imc')) {
_box = Hive.box('imc');
} else {
_box = await Hive.openBox('imc');
}
}
Com base no Benchmark disponível na documentação do hive, percebemos o quão grande é a diferença de perfomance do Hive entre seus princípais concorrentes como o SharedPreferences e o SQFlite, principalmente em momentos de escrita.
Já o SQFlite é um banco de dados SQL, ou seja, um banco de dados mais tradicional formado por tabelas e colunas fixas, onde são armazenadas informações. Diferente do Hive o SQFlite não possui suporte para todas as plataformas onde o flutter Flutter. Além disso o SQFlite possui mais linhas de códigos e comandos funcionar, sendo assim, acaba sendo mais dificultoso seu aprendizado se comparado com o Hive.
//Um exemplo de como iniciar uma Tabela com o SQFlite
Map<int, String> scripts = {
1: '''CREATE TABLE imc (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT,
genero TEXT,
altura INTEGER,
peso INTEGER,
imc REAL,
status TEXT,
);''',
};
static Database? db;
Future<Database> obterDatabase() async {
if (db == null) {
return await iniciarBancoDeDados();
} else {
return db!;
}
}
Future iniciarBancoDeDados() async {
var db = openDatabase(path.join(await getDatabasesPath(), 'databaseImc.db'),
version: scripts.length, onCreate: (Database db, int index) async {
for (var i = 1; i <= scripts.length; i++) {
await db.execute(scripts[i]!);
debugPrint(scripts[i]);
}
}, onUpgrade: (Database db, int oldVersion, int newVesion) async {
for (var i = oldVersion + 1; i <= scripts.length; i++) {
await db.execute(scripts[i]!);
debugPrint(scripts[i]);
}
});
return db;
}
Por fim, ambos bancos necessitam de outros packages para criar caminho ao diretório. No caso foi utilizado o Path Provider. Para o Hive ainda houve a adição de 2 outros packages para facilitar a criação de um objeto que possa ser armazenado na caixa, foi utilizado o Hive Generator com o Build Runner para gerar o código de um adapter para a classe que seria armazenada.
- Container
- SizedBox
- Card
- Center
- Padding
- Text
- Icon
- Column
- Row
- Expanded
- ListView.builder
- ListTile
- SafeArea
- Scaffold
- PageView
- BottomNavigationBar
- CircleAvatar
- TextField
- TextButton
- Inkwell
- AlertDialog
- ElevatedButton
- Dismissible
- Abstração
- Atributos
- Classes
- Encapsulamento
- Herança
- Interfaces
- Polimorfismo
- Métodos