Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. import 'dart:async';
  2. import 'package:bloc/bloc.dart';
  3. import 'package:meta/meta.dart';
  4. import 'package:flutter_todos/blocs/todos/todos.dart';
  5. import 'package:flutter_todos/models/models.dart';
  6. import 'package:todos_repository_simple/todos_repository_simple.dart';
  7.  
  8. class TodosBloc extends Bloc<TodosEvent, TodosState> {
  9. final TodosRepositoryFlutter todosRepository;
  10.  
  11. TodosBloc({@required this.todosRepository});
  12.  
  13. @override
  14. TodosState get initialState => TodosLoading();
  15.  
  16. @override
  17. Stream<TodosState> mapEventToState(
  18. TodosState currentState,
  19. TodosEvent event,
  20. ) async* {
  21. if (event is LoadTodos) {
  22. yield* _mapLoadTodosToState();
  23. } else if (event is AddTodo) {
  24. yield* _mapAddTodoToState(currentState, event);
  25. } else if (event is UpdateTodo) {
  26. yield* _mapUpdateTodoToState(currentState, event);
  27. } else if (event is DeleteTodo) {
  28. yield* _mapDeleteTodoToState(currentState, event);
  29. } else if (event is ToggleAll) {
  30. yield* _mapToggleAllToState(currentState);
  31. } else if (event is ClearCompleted) {
  32. yield* _mapClearCompletedToState(currentState);
  33. }
  34. }
  35.  
  36. Stream<TodosState> _mapLoadTodosToState() async* {
  37. try {
  38. final todos = await this.todosRepository.loadTodos();
  39. yield TodosLoaded(
  40. todos.map(Todo.fromEntity).toList(),
  41. );
  42. } catch (_) {
  43. yield TodosNotLoaded();
  44. }
  45. }
  46.  
  47. Stream<TodosState> _mapAddTodoToState(
  48. TodosState currentState,
  49. AddTodo event,
  50. ) async* {
  51. if (currentState is TodosLoaded) {
  52. final List<Todo> updatedTodos = List.from(currentState.todos)
  53. ..add(event.todo);
  54. yield TodosLoaded(updatedTodos);
  55. _saveTodos(updatedTodos);
  56. }
  57. }
  58.  
  59. Stream<TodosState> _mapUpdateTodoToState(
  60. TodosState currentState,
  61. UpdateTodo event,
  62. ) async* {
  63. if (currentState is TodosLoaded) {
  64. final List<Todo> updatedTodos = currentState.todos.map((todo) {
  65. return todo.id == event.updatedTodo.id ? event.updatedTodo : todo;
  66. }).toList();
  67. yield TodosLoaded(updatedTodos);
  68. _saveTodos(updatedTodos);
  69. }
  70. }
  71.  
  72. Stream<TodosState> _mapDeleteTodoToState(
  73. TodosState currentState,
  74. DeleteTodo event,
  75. ) async* {
  76. if (currentState is TodosLoaded) {
  77. final updatedTodos =
  78. currentState.todos.where((todo) => todo.id != event.todo.id).toList();
  79. yield TodosLoaded(updatedTodos);
  80. _saveTodos(updatedTodos);
  81. }
  82. }
  83.  
  84. Stream<TodosState> _mapToggleAllToState(TodosState currentState) async* {
  85. if (currentState is TodosLoaded) {
  86. final allComplete = currentState.todos.every((todo) => todo.complete);
  87. final List<Todo> updatedTodos = currentState.todos
  88. .map((todo) => todo.copyWith(complete: !allComplete))
  89. .toList();
  90. yield TodosLoaded(updatedTodos);
  91. _saveTodos(updatedTodos);
  92. }
  93. }
  94.  
  95. Stream<TodosState> _mapClearCompletedToState(TodosState currentState) async* {
  96. if (currentState is TodosLoaded) {
  97. final List<Todo> updatedTodos =
  98. currentState.todos.where((todo) => !todo.complete).toList();
  99. yield TodosLoaded(updatedTodos);
  100. _saveTodos(updatedTodos);
  101. }
  102. }
  103.  
  104. Future _saveTodos(List<Todo> todos) {
  105. return todosRepository.saveTodos(
  106. todos.map((todo) => todo.toEntity()).toList(),
  107. );
  108. }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement