Skip to content

Commit 93c4176

Browse files
committed
Update mvi_base
1 parent a3b4e41 commit 93c4176

22 files changed

+768
-151
lines changed

mvi_base/analysis_options.yaml

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,32 @@
1+
# This file configures the static analysis results for your project (errors,
2+
# warnings, and lints).
3+
#
4+
# This enables the 'recommended' set of lints from `package:lints`.
5+
# This set helps identify many issues that may lead to problems when running
6+
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
7+
# style and format.
8+
#
9+
# If you want a smaller set of lints you can change this to specify
10+
# 'package:lints/core.yaml'. These are just the most critical lints
11+
# (the recommended set includes the core lints).
12+
# The core lints are also what is used by pub.dev for scoring packages.
13+
14+
include: package:lints/recommended.yaml
15+
16+
# Uncomment the following section to specify additional rules.
17+
118
analyzer:
2-
# exclude:
3-
# - path/to/excluded/files/**
4-
5-
# Lint rules and documentation, see http://dart-lang.github.io/linter/lints
6-
linter:
7-
rules:
8-
- cancel_subscriptions
9-
- hash_and_equals
10-
- iterable_contains_unrelated_type
11-
- list_remove_unrelated_type
12-
- test_types_in_equals
13-
- unrelated_type_equality_checks
14-
- valid_regexps
19+
language:
20+
strict-casts: true
21+
strict-inference: true
22+
strict-raw-types: true
23+
24+
# linter:
25+
# rules:
26+
# - camel_case_types
27+
28+
# For more information about the core and recommended set of lints, see
29+
# https://dart.dev/go/core-lints
30+
31+
# For additional information about configuring this file, see
32+
# https://dart.dev/guides/language/analysis-options

mvi_base/lib/mvi_base.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ export 'src/mvi_core.dart';
55
export 'src/mvi_stats.dart';
66
export 'src/mvi_todo.dart';
77
export 'src/mvi_todos_list.dart';
8-
export 'src/todos_interactor.dart';
8+
export 'src/todo_list_interactor.dart';
99
export 'src/user_interactor.dart';

mvi_base/lib/src/models/todo.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@ class Todo {
99
final String note;
1010
final String task;
1111

12-
Todo(this.task, {this.complete = false, String note = '', String id})
13-
: this.note = note ?? '',
14-
this.id = id ?? Uuid().generateV4();
12+
Todo(this.task, {this.complete = false, this.note = '', String? id})
13+
: id = id ?? Uuid().generateV4();
1514

16-
Todo copyWith({bool complete, String id, String note, String task}) {
15+
Todo copyWith({bool? complete, String? id, String? note, String? task}) {
1716
return Todo(
1817
task ?? this.task,
1918
complete: complete ?? this.complete,
@@ -48,7 +47,7 @@ class Todo {
4847
static Todo fromEntity(TodoEntity entity) {
4948
return Todo(
5049
entity.task,
51-
complete: entity.complete ?? false,
50+
complete: entity.complete,
5251
note: entity.note,
5352
id: entity.id ?? Uuid().generateV4(),
5453
);

mvi_base/lib/src/models/user.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import 'package:todos_repository_core/todos_repository_core.dart';
55
class User {
66
final String displayName;
77

8-
User(this.displayName);
8+
User({required this.displayName});
99

10-
UserEntity toEntity() => UserEntity(displayName: displayName);
10+
UserEntity toEntity() =>
11+
UserEntity(displayName: displayName, id: '', photoUrl: '');
1112

12-
static User fromEntity(UserEntity entity) => User(entity.displayName);
13+
static User fromEntity(UserEntity entity) =>
14+
User(displayName: entity.displayName);
1315

1416
@override
1517
String toString() {

mvi_base/lib/src/mvi_core.dart

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'package:meta/meta.dart';
44
import 'package:rxdart/rxdart.dart';
55

66
abstract class MviDisposable {
7-
Future tearDown();
7+
Future<void> tearDown();
88
}
99

1010
// A class that should contain a number of broadcast StreamControllers. These
@@ -21,7 +21,7 @@ class MviPresenter<ViewModel> extends Stream<ViewModel>
2121
final BehaviorSubject<ViewModel> _subject;
2222
final List<StreamSubscription<dynamic>> subscriptions = [];
2323

24-
MviPresenter({@required Stream<ViewModel> stream, ViewModel initialModel})
24+
MviPresenter({required Stream<ViewModel> stream, ViewModel? initialModel})
2525
: _subject = _createSubject<ViewModel>(stream, initialModel);
2626

2727
// Get the current state. Useful for initial renders or re-renders when we
@@ -30,29 +30,29 @@ class MviPresenter<ViewModel> extends Stream<ViewModel>
3030

3131
void setUp() {}
3232

33+
@override
3334
@mustCallSuper
34-
Future tearDown() => Future.wait(
35-
[_subject.close()]..addAll(subscriptions.map((s) => s.cancel())),
36-
);
35+
Future<void> tearDown() =>
36+
Future.wait([_subject.close(), ...subscriptions.map((s) => s.cancel())]);
3737

38-
static _createSubject<ViewState>(
38+
static BehaviorSubject<ViewState> _createSubject<ViewState>(
3939
Stream<ViewState> model,
40-
ViewState initialState,
40+
ViewState? initialState,
4141
) {
42-
StreamSubscription<ViewState> subscription;
43-
BehaviorSubject<ViewState> _subject;
42+
late StreamSubscription<ViewState> subscription;
43+
late BehaviorSubject<ViewState> subject;
44+
4445
void onListen() {
4546
subscription = model.listen(
46-
_subject.add,
47-
onError: _subject.addError,
48-
onDone: _subject.close,
47+
subject.add,
48+
onError: subject.addError,
49+
onDone: subject.close,
4950
);
5051
}
5152

52-
;
5353
void onCancel() => subscription.cancel();
5454

55-
_subject = initialState == null
55+
subject = initialState == null
5656
? BehaviorSubject<ViewState>(
5757
onListen: onListen,
5858
onCancel: onCancel,
@@ -64,19 +64,21 @@ class MviPresenter<ViewModel> extends Stream<ViewModel>
6464
onCancel: onCancel,
6565
);
6666

67-
return _subject;
67+
return subject;
6868
}
6969

7070
@override
7171
StreamSubscription<ViewModel> listen(
72-
void Function(ViewModel event) onData, {
73-
Function onError,
74-
void Function() onDone,
75-
bool cancelOnError,
76-
}) => _subject.stream.listen(
77-
onData,
78-
onError: onError,
79-
onDone: onDone,
80-
cancelOnError: cancelOnError,
81-
);
72+
void Function(ViewModel event)? onData, {
73+
Function? onError,
74+
void Function()? onDone,
75+
bool? cancelOnError,
76+
}) {
77+
return _subject.stream.listen(
78+
onData,
79+
onError: onError,
80+
onDone: onDone,
81+
cancelOnError: cancelOnError,
82+
);
83+
}
8284
}

mvi_base/lib/src/mvi_stats.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:mvi_base/src/mvi_core.dart';
33
import 'package:rxdart/rxdart.dart';
44

55
class StatsPresenter extends MviPresenter<StatsModel> {
6-
StatsPresenter(TodosInteractor interactor)
6+
StatsPresenter(TodoListInteractor interactor)
77
: super(
88
stream: Rx.combineLatest2(
99
interactor.todos.map(_numActive),

mvi_base/lib/src/mvi_todo.dart

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
import 'dart:async';
22

3-
import 'package:meta/meta.dart';
43
import 'package:mvi_base/src/models/models.dart';
54
import 'package:mvi_base/src/mvi_core.dart';
6-
import 'package:mvi_base/src/todos_interactor.dart';
5+
import 'package:mvi_base/src/todo_list_interactor.dart';
76

87
mixin DetailView implements MviView {
98
final deleteTodo = StreamController<String>.broadcast(sync: true);
109

1110
final updateTodo = StreamController<Todo>.broadcast(sync: true);
1211

1312
@override
14-
Future tearDown() {
13+
Future<void> tearDown() {
1514
return Future.wait([deleteTodo.close(), updateTodo.close()]);
1615
}
1716
}
1817

1918
class DetailPresenter extends MviPresenter<Todo> {
2019
final DetailView _view;
21-
final TodosInteractor _interactor;
20+
final TodoListInteractor _interactor;
2221

2322
DetailPresenter({
24-
@required String id,
25-
@required DetailView view,
26-
@required TodosInteractor interactor,
23+
required String id,
24+
required DetailView view,
25+
required TodoListInteractor interactor,
2726
}) : _view = view,
2827
_interactor = interactor,
2928
super(stream: interactor.todo(id));

mvi_base/lib/src/mvi_todos_list.dart

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import 'dart:async';
22

3-
import 'package:meta/meta.dart';
3+
import 'package:collection/equality.dart';
44
import 'package:mvi_base/src/models/models.dart';
5-
import 'package:mvi_base/src/models/user.dart';
65
import 'package:mvi_base/src/mvi_core.dart';
7-
import 'package:mvi_base/src/todos_interactor.dart';
6+
import 'package:mvi_base/src/todo_list_interactor.dart';
87
import 'package:mvi_base/src/user_interactor.dart';
98
import 'package:rxdart/rxdart.dart';
109

@@ -17,15 +16,22 @@ class TodosListModel {
1716
final User user;
1817

1918
TodosListModel({
20-
this.activeFilter,
21-
this.allComplete,
22-
this.hasCompletedTodos,
23-
this.visibleTodos,
24-
this.loading,
25-
this.user,
19+
required this.activeFilter,
20+
required this.allComplete,
21+
required this.hasCompletedTodos,
22+
required this.visibleTodos,
23+
required this.loading,
24+
required this.user,
2625
});
2726

28-
factory TodosListModel.initial() => TodosListModel(loading: true);
27+
factory TodosListModel.initial() => TodosListModel(
28+
loading: true,
29+
activeFilter: VisibilityFilter.all,
30+
allComplete: false,
31+
hasCompletedTodos: false,
32+
visibleTodos: [],
33+
user: User(displayName: ''),
34+
);
2935

3036
@override
3137
String toString() {
@@ -40,7 +46,7 @@ class TodosListModel {
4046
activeFilter == other.activeFilter &&
4147
allComplete == other.allComplete &&
4248
hasCompletedTodos == other.hasCompletedTodos &&
43-
visibleTodos == other.visibleTodos &&
49+
const ListEquality<Todo>().equals(visibleTodos, other.visibleTodos) &&
4450
loading == other.loading &&
4551
user == other.user;
4652

@@ -69,7 +75,8 @@ class TodosListView implements MviView {
6975
VisibilityFilter.all,
7076
);
7177

72-
Future<List<dynamic>> tearDown() {
78+
@override
79+
Future<void> tearDown() {
7380
return Future.wait([
7481
addTodo.close(),
7582
deleteTodo.close(),
@@ -83,12 +90,12 @@ class TodosListView implements MviView {
8390

8491
class TodosListPresenter extends MviPresenter<TodosListModel> {
8592
final TodosListView _view;
86-
final TodosInteractor _interactor;
93+
final TodoListInteractor _interactor;
8794

8895
TodosListPresenter({
89-
@required TodosListView view,
90-
@required TodosInteractor todosInteractor,
91-
@required UserInteractor userInteractor,
96+
required TodosListView view,
97+
required TodoListInteractor todosInteractor,
98+
required UserInteractor userInteractor,
9299
}) : _view = view,
93100
_interactor = todosInteractor,
94101
super(
@@ -109,7 +116,7 @@ class TodosListPresenter extends MviPresenter<TodosListModel> {
109116

110117
static Stream<TodosListModel> _buildStream(
111118
TodosListView view,
112-
TodosInteractor interactor,
119+
TodoListInteractor interactor,
113120
UserInteractor repository,
114121
) {
115122
return Rx.defer(() async* {
@@ -145,7 +152,6 @@ class TodosListPresenter extends MviPresenter<TodosListModel> {
145152
case VisibilityFilter.completed:
146153
return todos.where((todo) => todo.complete).toList();
147154
case VisibilityFilter.all:
148-
default:
149155
return todos;
150156
}
151157
}

mvi_base/lib/src/todos_interactor.dart renamed to mvi_base/lib/src/todo_list_interactor.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import 'dart:async';
22

3+
import 'package:collection/collection.dart';
34
import 'package:mvi_base/mvi_base.dart';
5+
import 'package:rxdart/rxdart.dart';
46
import 'package:todos_repository_core/todos_repository_core.dart';
57

6-
class TodosInteractor {
8+
class TodoListInteractor {
79
final ReactiveTodosRepository repository;
810

9-
TodosInteractor(this.repository);
11+
TodoListInteractor(this.repository);
1012

1113
Stream<List<Todo>> get todos {
1214
return repository.todos().map(
@@ -16,10 +18,8 @@ class TodosInteractor {
1618

1719
Stream<Todo> todo(String id) {
1820
return todos
19-
.map((todos) {
20-
return todos.firstWhere((todo) => todo.id == id, orElse: () => null);
21-
})
22-
.where((todo) => todo != null);
21+
.map((todos) => todos.firstWhereOrNull((todo) => todo.id == id))
22+
.whereNotNull();
2323
}
2424

2525
Stream<bool> get allComplete => todos.map(_allComplete);

mvi_base/lib/src/user_interactor.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ class UserInteractor {
88

99
UserInteractor(UserRepository repository) : _repository = repository;
1010

11-
Future<User> login() async => User((await _repository.login()).displayName);
11+
Future<User> login() async =>
12+
User(displayName: (await _repository.login()).displayName);
1213
}

0 commit comments

Comments
 (0)