Skip to content

Instantly share code, notes, and snippets.

@roipeker
Created August 27, 2020 02:56
Show Gist options
  • Save roipeker/7b38824e7d0e415abae631ddb49bb124 to your computer and use it in GitHub Desktop.
Save roipeker/7b38824e7d0e415abae631ddb49bb124 to your computer and use it in GitHub Desktop.
Sample GetX todo list.
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class SampleTodoDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
home: TodoPage(),
);
}
}
class TodoModel {
String name;
bool checked;
bool isEdit = false;
TodoModel(this.name, [this.checked = false]);
}
class TodoController extends GetxController {
static TodoController get() {
final gi = GetInstance();
return gi.isRegistered<TodoController>()
? gi.find<TodoController>()
: gi.put<TodoController>(TodoController());
}
final _list = <Rx<TodoModel>>[].obs;
List<Rx<TodoModel>> get list => _list.value;
void addItem() {
final item = TodoModel('blah', false);
_list.add(Rx<TodoModel>(item));
}
void editItem(Rx<TodoModel> model) {
model.update((v) => v.isEdit = !v.isEdit);
if (model.value.isEdit) Get.focusScope.unfocus();
}
void updateItemCheck(Rx<TodoModel> model, bool flag) {
model.update((v) => v.checked = flag);
}
updateItemName(Rx<TodoModel> model, String str) {
model.update((v) => v.name = str);
}
removeItem(Rx<TodoModel> model) {
_list.remove(model);
}
}
class TodoPage extends StatelessWidget {
final controller = TodoController.get();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('todos'),
actions: [
IconButton(icon: Icon(Icons.add), onPressed: controller.addItem),
],
),
body: Obx(() {
final list = controller.list;
if (list.isEmpty) {
return Center(child: Text('list is empty'));
}
return ListView.builder(
itemBuilder: (ctx, idx) => _buildItem(list[idx]),
itemCount: list.length,
);
}),
);
}
Widget _buildItem(Rx<TodoModel> rx) {
return Obx(
() {
final model = rx.value;
return ListTile(
leading: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(model.isEdit ? Icons.check : Icons.create),
onPressed: () => controller.editItem(rx),
),
if (!model.isEdit)
IconButton(
icon: Icon(Icons.remove_circle),
onPressed: () => controller.removeItem(rx),
),
],
),
title: !model.isEdit
? Text(model.name)
: TextFormField(
initialValue: model.name,
autofocus: true,
enabled: model.isEdit,
onChanged: (str) => controller.updateItemName(rx, str),
),
trailing: Checkbox(
value: model.checked,
onChanged: (flag) => controller.updateItemCheck(rx, flag),
),
);
},
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment