Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'pages/home/home_bloc.dart';
import 'pages/home/home_page.dart';

class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
const MyApp({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
Expand Down
40 changes: 20 additions & 20 deletions lib/data/contact_repository_impl.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import 'package:built_collection/built_collection.dart';
import 'package:collection/collection.dart';

import '../domain/contact.dart';
import '../domain/contact_repository.dart';
import 'local/dao/contact_dao.dart';
Expand All @@ -9,39 +12,36 @@ class ContactRepositoryImpl implements ContactRepository {
const ContactRepositoryImpl(this._contactDao);

@override
Stream<List<Contact>> search({String query = ''}) {
return _contactDao.search(query).map((entities) {
return entities.map(_toContact).toList(growable: false);
});
Stream<BuiltList<Contact>> search({required String by}) {
return _contactDao.search(by).map(
(entities) => entities.map(_toContact).whereNotNull().toBuiltList());
}

@override
Stream<Contact> getContactById(int id) {
return _contactDao.findById(id).map(_toContact);
}
Stream<Contact?> getContactById(int id) =>
_contactDao.findById(id).map(_toContact);

@override
Future<bool> delete(Contact contact) {
return _contactDao.deleteById(contact.id);
}
Future<bool> delete(Contact contact) => _contactDao
.deleteById(ArgumentError.checkNotNull(contact.id, 'Contact id'));

@override
Future<bool> insert(Contact contact) {
return _contactDao.insert(_toEntity(contact));
}
Future<bool> insert(Contact contact) =>
_contactDao.insert(_toEntity(contact));

@override
Future<bool> update(Contact contact) {
return _contactDao.update(_toEntity(contact));
}
Future<bool> update(Contact contact) =>
_contactDao.update(_toEntity(contact));

@override
Future<void> deleteAll() {
return _contactDao.deleteAll();
}
Future<void> deleteAll() => _contactDao.deleteAll();
}

Contact _toContact(ContactEntity entity) {
Contact? _toContact(ContactEntity? entity) {
if (entity == null) {
return null;
}

return Contact(
(b) => b
..id = entity.id
Expand Down
2 changes: 1 addition & 1 deletion lib/data/local/dao/contact_dao.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'contact_entity.dart';
abstract class ContactDao {
Stream<List<ContactEntity>> search(String query);

Stream<ContactEntity> findById(int id);
Stream<ContactEntity?> findById(int id);

Future<bool> deleteById(int id);

Expand Down
2 changes: 1 addition & 1 deletion lib/data/local/dao/contact_dao_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class ContactDaoImpl implements ContactDao {
}

@override
Stream<ContactEntity> findById(int id) {
Stream<ContactEntity?> findById(int id) {
return Stream.fromFuture(_briteDatabaseFuture).flatMap((db) {
return db
.createQuery(
Expand Down
19 changes: 9 additions & 10 deletions lib/data/local/dao/contact_entity.dart
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
import 'package:meta/meta.dart';

import 'contact_entry.dart';

class ContactEntity {
final int id;
final int? id;
final String name;
final String phone;
final String address;
final bool male;
final DateTime updatedAt;
final DateTime createdAt;
final DateTime? createdAt;

const ContactEntity({
@required this.id,
@required this.name,
@required this.phone,
@required this.address,
@required this.male,
@required this.updatedAt,
@required this.createdAt,
required this.id,
required this.name,
required this.phone,
required this.address,
required this.male,
required this.updatedAt,
required this.createdAt,
});

factory ContactEntity.fromJson(Map<String, dynamic> json) {
Expand Down
6 changes: 2 additions & 4 deletions lib/domain/contact.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import 'package:built_value/built_value.dart';
part 'contact.g.dart';

abstract class Contact implements Built<Contact, ContactBuilder> {
@nullable
int get id;
int? get id;

String get name;

Expand All @@ -17,8 +16,7 @@ abstract class Contact implements Built<Contact, ContactBuilder> {

DateTime get updatedAt;

@nullable
DateTime get createdAt;
DateTime? get createdAt;

Contact._();

Expand Down
62 changes: 31 additions & 31 deletions lib/domain/contact.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions lib/domain/contact_repository.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import 'package:built_collection/built_collection.dart';

import 'contact.dart';

abstract class ContactRepository {
Stream<List<Contact>> search({String query = ''});
Stream<BuiltList<Contact>> search({required String by});

Stream<Contact> getContactById(int id);
Stream<Contact?> getContactById(int id);

Future<bool> delete(Contact contact);

Expand Down
12 changes: 4 additions & 8 deletions lib/pages/detail/detail_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,18 @@ import '../../domain/contact.dart';
import '../../domain/contact_repository.dart';

class DetailBloc extends DisposeCallbackBaseBloc {
final DistinctValueStream<Contact> contact$;
final DistinctValueStream<Contact?> contact$;

DetailBloc._(
this.contact$,
Func0<void> dispose,
) : super(dispose);
DetailBloc._(this.contact$, VoidAction dispose) : super(dispose);

factory DetailBloc(
final ContactRepository contactRepo,
final Contact initial,
) {
assert(contactRepo != null, 'contactRepo cannot be null');
assert(initial != null, 'initial cannot be null');
final id = ArgumentError.checkNotNull(initial.id, 'Contact id');

final contact$ =
contactRepo.getContactById(initial.id).publishValueDistinct(initial);
contactRepo.getContactById(id).publishValueDistinct(initial);

final bag = DisposeBag([
contact$.debug(identifier: '[DETAIL_BLOC] contact').collect(),
Expand Down
10 changes: 5 additions & 5 deletions lib/pages/detail/detail_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import '../edit_or_add/edit_or_add_page.dart';
import 'detail_bloc.dart';

class DetailPage extends StatefulWidget {
const DetailPage({Key key}) : super(key: key);
const DetailPage({Key? key}) : super(key: key);

@override
_DetailPageState createState() => _DetailPageState();
Expand All @@ -19,8 +19,8 @@ class DetailPage extends StatefulWidget {
class _DetailPageState extends State<DetailPage> {
final _dateFormat = DateFormat.yMd().add_Hms();
final scrollController = ScrollController();
double _scale;
double _top;
var _scale = 0.0;
var _top = 0.0;

void calculateScaleAndTop() {
final defaultTopMargin = 256.0 - 23.0;
Expand Down Expand Up @@ -66,7 +66,7 @@ class _DetailPageState extends State<DetailPage> {
final height = MediaQuery.of(context).size.height;

return Scaffold(
body: RxStreamBuilder<Contact>(
body: RxStreamBuilder<Contact?>(
stream: bloc.contact$,
builder: (context, contact) {
return Stack(
Expand Down Expand Up @@ -180,7 +180,7 @@ class _DetailPageState extends State<DetailPage> {
leading: Icon(Icons.create),
title: Text('Created at: '),
subtitle: Text(
_dateFormat.format(contact.createdAt),
_dateFormat.format(contact.createdAt!),
),
),
ListTile(
Expand Down
Loading