From 7d64b7b3ca3c600fd1cce289ebded9853e39a766 Mon Sep 17 00:00:00 2001 From: kouki Date: Tue, 13 Oct 2020 23:16:01 +0900 Subject: [PATCH 1/6] add getOrgStream --- .../organization_repository_interface.dart | 1 + .../mocks/organization_repository_mock.dart | 6 ++++++ lib/repositories/organization_repository.dart | 14 ++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/lib/repositories/interfaces/organization_repository_interface.dart b/lib/repositories/interfaces/organization_repository_interface.dart index d096445..739bd0b 100644 --- a/lib/repositories/interfaces/organization_repository_interface.dart +++ b/lib/repositories/interfaces/organization_repository_interface.dart @@ -5,6 +5,7 @@ abstract class OrganizationRepositoryInterface { Future create(Organization org); Future update(Organization org); Future getOrganization(String id); + Stream getOrgStream(String id); Future> getOrganizations(String ownerId); Future> getHolidays(String id); } diff --git a/lib/repositories/mocks/organization_repository_mock.dart b/lib/repositories/mocks/organization_repository_mock.dart index a789711..219c1cc 100644 --- a/lib/repositories/mocks/organization_repository_mock.dart +++ b/lib/repositories/mocks/organization_repository_mock.dart @@ -77,4 +77,10 @@ class OrganizationRepositoryMock extends OrganizationRepositoryInterface { // TODO: implement getHolidays throw UnimplementedError(); } + + @override + Stream getOrgStream(String id) { + // TODO: implement getOrgStream + throw UnimplementedError(); + } } diff --git a/lib/repositories/organization_repository.dart b/lib/repositories/organization_repository.dart index 3ca7211..b54dc34 100644 --- a/lib/repositories/organization_repository.dart +++ b/lib/repositories/organization_repository.dart @@ -31,6 +31,20 @@ class OrganizationRepository extends OrganizationRepositoryInterface { return _fromJson(json); } + @override + Stream getOrgStream(String id) { + final Stream orgStream = + firestore.collection(collectionName).doc(id).snapshots(); + return orgStream.asyncMap((snapshot) async { + final json = snapshot.data(); + if (json == null) { + return const Organization(); + } + final org = await _fromJson(json); + return org; + }); + } + @override Future> getOrganizations(String ownerId) async { final orgs = firestore From 4d80a644a0ad82c7ca5564036d9960b5f32a2083 Mon Sep 17 00:00:00 2001 From: kouki Date: Tue, 13 Oct 2020 23:38:21 +0900 Subject: [PATCH 2/6] =?UTF-8?q?LoginState=E3=81=ABselectedOrgStream?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/login/login_state.dart | 2 + lib/pages/login/login_state.freezed.dart | 52 +++++++++++++++------ lib/pages/login/login_state_controller.dart | 18 +++++-- 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/lib/pages/login/login_state.dart b/lib/pages/login/login_state.dart index 233b86f..7e5f178 100644 --- a/lib/pages/login/login_state.dart +++ b/lib/pages/login/login_state.dart @@ -9,6 +9,8 @@ abstract class LoginState with _$LoginState { @Default(false) bool isLogin, User currentUser, @Default([]) List orgs, + // TODO: streamに完全対応できたら削除 @Default(Organization()) Organization selectedOrg, + @Default(null) Stream selectedOrgStream, }) = _LoginState; } diff --git a/lib/pages/login/login_state.freezed.dart b/lib/pages/login/login_state.freezed.dart index f44e83e..8e82026 100644 --- a/lib/pages/login/login_state.freezed.dart +++ b/lib/pages/login/login_state.freezed.dart @@ -18,12 +18,14 @@ class _$LoginStateTearOff { {bool isLogin = false, User currentUser, List orgs = const [], - Organization selectedOrg = const Organization()}) { + Organization selectedOrg = const Organization(), + Stream selectedOrgStream = null}) { return _LoginState( isLogin: isLogin, currentUser: currentUser, orgs: orgs, selectedOrg: selectedOrg, + selectedOrgStream: selectedOrgStream, ); } } @@ -36,8 +38,9 @@ const $LoginState = _$LoginStateTearOff(); mixin _$LoginState { bool get isLogin; User get currentUser; - List get orgs; + List get orgs; // TODO: streamに完全対応できたら削除 Organization get selectedOrg; + Stream get selectedOrgStream; $LoginStateCopyWith get copyWith; } @@ -51,7 +54,8 @@ abstract class $LoginStateCopyWith<$Res> { {bool isLogin, User currentUser, List orgs, - Organization selectedOrg}); + Organization selectedOrg, + Stream selectedOrgStream}); $UserCopyWith<$Res> get currentUser; $OrganizationCopyWith<$Res> get selectedOrg; @@ -71,6 +75,7 @@ class _$LoginStateCopyWithImpl<$Res> implements $LoginStateCopyWith<$Res> { Object currentUser = freezed, Object orgs = freezed, Object selectedOrg = freezed, + Object selectedOrgStream = freezed, }) { return _then(_value.copyWith( isLogin: isLogin == freezed ? _value.isLogin : isLogin as bool, @@ -80,6 +85,9 @@ class _$LoginStateCopyWithImpl<$Res> implements $LoginStateCopyWith<$Res> { selectedOrg: selectedOrg == freezed ? _value.selectedOrg : selectedOrg as Organization, + selectedOrgStream: selectedOrgStream == freezed + ? _value.selectedOrgStream + : selectedOrgStream as Stream, )); } @@ -114,7 +122,8 @@ abstract class _$LoginStateCopyWith<$Res> implements $LoginStateCopyWith<$Res> { {bool isLogin, User currentUser, List orgs, - Organization selectedOrg}); + Organization selectedOrg, + Stream selectedOrgStream}); @override $UserCopyWith<$Res> get currentUser; @@ -138,6 +147,7 @@ class __$LoginStateCopyWithImpl<$Res> extends _$LoginStateCopyWithImpl<$Res> Object currentUser = freezed, Object orgs = freezed, Object selectedOrg = freezed, + Object selectedOrgStream = freezed, }) { return _then(_LoginState( isLogin: isLogin == freezed ? _value.isLogin : isLogin as bool, @@ -147,6 +157,9 @@ class __$LoginStateCopyWithImpl<$Res> extends _$LoginStateCopyWithImpl<$Res> selectedOrg: selectedOrg == freezed ? _value.selectedOrg : selectedOrg as Organization, + selectedOrgStream: selectedOrgStream == freezed + ? _value.selectedOrgStream + : selectedOrgStream as Stream, )); } } @@ -157,10 +170,12 @@ class _$_LoginState with DiagnosticableTreeMixin implements _LoginState { {this.isLogin = false, this.currentUser, this.orgs = const [], - this.selectedOrg = const Organization()}) + this.selectedOrg = const Organization(), + this.selectedOrgStream = null}) : assert(isLogin != null), assert(orgs != null), - assert(selectedOrg != null); + assert(selectedOrg != null), + assert(selectedOrgStream != null); @JsonKey(defaultValue: false) @override @@ -171,12 +186,15 @@ class _$_LoginState with DiagnosticableTreeMixin implements _LoginState { @override final List orgs; @JsonKey(defaultValue: const Organization()) - @override + @override // TODO: streamに完全対応できたら削除 final Organization selectedOrg; + @JsonKey(defaultValue: null) + @override + final Stream selectedOrgStream; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'LoginState(isLogin: $isLogin, currentUser: $currentUser, orgs: $orgs, selectedOrg: $selectedOrg)'; + return 'LoginState(isLogin: $isLogin, currentUser: $currentUser, orgs: $orgs, selectedOrg: $selectedOrg, selectedOrgStream: $selectedOrgStream)'; } @override @@ -187,7 +205,8 @@ class _$_LoginState with DiagnosticableTreeMixin implements _LoginState { ..add(DiagnosticsProperty('isLogin', isLogin)) ..add(DiagnosticsProperty('currentUser', currentUser)) ..add(DiagnosticsProperty('orgs', orgs)) - ..add(DiagnosticsProperty('selectedOrg', selectedOrg)); + ..add(DiagnosticsProperty('selectedOrg', selectedOrg)) + ..add(DiagnosticsProperty('selectedOrgStream', selectedOrgStream)); } @override @@ -204,7 +223,10 @@ class _$_LoginState with DiagnosticableTreeMixin implements _LoginState { const DeepCollectionEquality().equals(other.orgs, orgs)) && (identical(other.selectedOrg, selectedOrg) || const DeepCollectionEquality() - .equals(other.selectedOrg, selectedOrg))); + .equals(other.selectedOrg, selectedOrg)) && + (identical(other.selectedOrgStream, selectedOrgStream) || + const DeepCollectionEquality() + .equals(other.selectedOrgStream, selectedOrgStream))); } @override @@ -213,7 +235,8 @@ class _$_LoginState with DiagnosticableTreeMixin implements _LoginState { const DeepCollectionEquality().hash(isLogin) ^ const DeepCollectionEquality().hash(currentUser) ^ const DeepCollectionEquality().hash(orgs) ^ - const DeepCollectionEquality().hash(selectedOrg); + const DeepCollectionEquality().hash(selectedOrg) ^ + const DeepCollectionEquality().hash(selectedOrgStream); @override _$LoginStateCopyWith<_LoginState> get copyWith => @@ -225,7 +248,8 @@ abstract class _LoginState implements LoginState { {bool isLogin, User currentUser, List orgs, - Organization selectedOrg}) = _$_LoginState; + Organization selectedOrg, + Stream selectedOrgStream}) = _$_LoginState; @override bool get isLogin; @@ -233,8 +257,10 @@ abstract class _LoginState implements LoginState { User get currentUser; @override List get orgs; - @override + @override // TODO: streamに完全対応できたら削除 Organization get selectedOrg; @override + Stream get selectedOrgStream; + @override _$LoginStateCopyWith<_LoginState> get copyWith; } diff --git a/lib/pages/login/login_state_controller.dart b/lib/pages/login/login_state_controller.dart index aed8322..c734557 100644 --- a/lib/pages/login/login_state_controller.dart +++ b/lib/pages/login/login_state_controller.dart @@ -8,7 +8,7 @@ import 'package:state_notifier/state_notifier.dart'; import 'login_state.dart'; class LoginStateController extends StateNotifier with LocatorMixin { - LoginStateController() : super(const LoginState()); + LoginStateController() : super(LoginState()); UserRepositoryInterface get userRepository => read(); OrganizationRepositoryInterface get orgRepository => @@ -19,7 +19,10 @@ class LoginStateController extends StateNotifier with LocatorMixin { super.initState(); fetchLoginState(); if (state.selectedOrg == null && state.currentUser != null) { - state = state.copyWith(selectedOrg: state.orgs.first); + state = state.copyWith( + selectedOrg: state.orgs.first, + selectedOrgStream: orgRepository.getOrgStream(state.orgs.first.id), + ); } } @@ -38,13 +41,17 @@ class LoginStateController extends StateNotifier with LocatorMixin { logger.info('fetchLoginState: selectedOrg = ${state.selectedOrg}'); if (state.selectedOrg.id == null && state.orgs.isNotEmpty) { logger.info('fetchLoginState: set selectedOrg'); - state = state.copyWith(selectedOrg: state.orgs.first); + state = state.copyWith( + selectedOrg: state.orgs.first, + selectedOrgStream: orgRepository.getOrgStream(state.orgs.first.id), + ); logger.info('fetchLoginState: selectedOrg = ${state.selectedOrg}'); } } else { state = state.copyWith( orgs: [], selectedOrg: const Organization(), + selectedOrgStream: null, ); } logger.info('fetchLoginState: state = $state'); @@ -66,7 +73,10 @@ class LoginStateController extends StateNotifier with LocatorMixin { } Future selectOrg(Organization newOrg) async { - state = state.copyWith(selectedOrg: newOrg); + state = state.copyWith( + selectedOrg: newOrg, + selectedOrgStream: orgRepository.getOrgStream(newOrg.id), + ); logger.info('selectOrg: ${state.selectedOrg}'); } From a884973adbccd2503a3b49b1e19a4660d6d69d4f Mon Sep 17 00:00:00 2001 From: kouki Date: Tue, 13 Oct 2020 23:42:39 +0900 Subject: [PATCH 3/6] =?UTF-8?q?selectedOrgStream=E3=82=92nullable=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/pages/login/login_state.dart | 2 +- lib/pages/login/login_state.freezed.dart | 16 +++++++++------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index c8b9251..4592519 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -584,4 +584,4 @@ /* End XCConfigurationList section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; -} \ No newline at end of file +} diff --git a/lib/pages/login/login_state.dart b/lib/pages/login/login_state.dart index 7e5f178..2a899c2 100644 --- a/lib/pages/login/login_state.dart +++ b/lib/pages/login/login_state.dart @@ -11,6 +11,6 @@ abstract class LoginState with _$LoginState { @Default([]) List orgs, // TODO: streamに完全対応できたら削除 @Default(Organization()) Organization selectedOrg, - @Default(null) Stream selectedOrgStream, + @Default(null) @nullable Stream selectedOrgStream, }) = _LoginState; } diff --git a/lib/pages/login/login_state.freezed.dart b/lib/pages/login/login_state.freezed.dart index 8e82026..6ca1aca 100644 --- a/lib/pages/login/login_state.freezed.dart +++ b/lib/pages/login/login_state.freezed.dart @@ -19,7 +19,7 @@ class _$LoginStateTearOff { User currentUser, List orgs = const [], Organization selectedOrg = const Organization(), - Stream selectedOrgStream = null}) { + @nullable Stream selectedOrgStream = null}) { return _LoginState( isLogin: isLogin, currentUser: currentUser, @@ -40,6 +40,7 @@ mixin _$LoginState { User get currentUser; List get orgs; // TODO: streamに完全対応できたら削除 Organization get selectedOrg; + @nullable Stream get selectedOrgStream; $LoginStateCopyWith get copyWith; @@ -55,7 +56,7 @@ abstract class $LoginStateCopyWith<$Res> { User currentUser, List orgs, Organization selectedOrg, - Stream selectedOrgStream}); + @nullable Stream selectedOrgStream}); $UserCopyWith<$Res> get currentUser; $OrganizationCopyWith<$Res> get selectedOrg; @@ -123,7 +124,7 @@ abstract class _$LoginStateCopyWith<$Res> implements $LoginStateCopyWith<$Res> { User currentUser, List orgs, Organization selectedOrg, - Stream selectedOrgStream}); + @nullable Stream selectedOrgStream}); @override $UserCopyWith<$Res> get currentUser; @@ -171,11 +172,10 @@ class _$_LoginState with DiagnosticableTreeMixin implements _LoginState { this.currentUser, this.orgs = const [], this.selectedOrg = const Organization(), - this.selectedOrgStream = null}) + @nullable this.selectedOrgStream = null}) : assert(isLogin != null), assert(orgs != null), - assert(selectedOrg != null), - assert(selectedOrgStream != null); + assert(selectedOrg != null); @JsonKey(defaultValue: false) @override @@ -190,6 +190,7 @@ class _$_LoginState with DiagnosticableTreeMixin implements _LoginState { final Organization selectedOrg; @JsonKey(defaultValue: null) @override + @nullable final Stream selectedOrgStream; @override @@ -249,7 +250,7 @@ abstract class _LoginState implements LoginState { User currentUser, List orgs, Organization selectedOrg, - Stream selectedOrgStream}) = _$_LoginState; + @nullable Stream selectedOrgStream}) = _$_LoginState; @override bool get isLogin; @@ -260,6 +261,7 @@ abstract class _LoginState implements LoginState { @override // TODO: streamに完全対応できたら削除 Organization get selectedOrg; @override + @nullable Stream get selectedOrgStream; @override _$LoginStateCopyWith<_LoginState> get copyWith; From 70a01e922d5342b812ccb5bb7535c6103b4cb1b9 Mon Sep 17 00:00:00 2001 From: kouki Date: Wed, 14 Oct 2020 11:22:29 +0900 Subject: [PATCH 4/6] =?UTF-8?q?memperpage=E3=82=92=E4=BB=96=E3=83=87?= =?UTF-8?q?=E3=83=90=E3=82=A4=E3=82=B9=E3=81=A7=E3=81=84=E3=81=98=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E3=81=A8=E3=81=8D=E3=81=AB=E3=83=AA=E3=82=A2=E3=83=AB?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=A0=E3=81=A7=E6=9B=B4=E6=96=B0=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/login/login_state_controller.dart | 1 - lib/pages/member/member_item.dart | 7 +--- lib/pages/member/member_page.dart | 32 ++++++++------ lib/pages/member/member_state.dart | 1 + lib/pages/member/member_state.freezed.dart | 42 +++++++++++++++---- lib/pages/member/member_state_controller.dart | 12 ++++-- 6 files changed, 65 insertions(+), 30 deletions(-) diff --git a/lib/pages/login/login_state_controller.dart b/lib/pages/login/login_state_controller.dart index c734557..5b09027 100644 --- a/lib/pages/login/login_state_controller.dart +++ b/lib/pages/login/login_state_controller.dart @@ -51,7 +51,6 @@ class LoginStateController extends StateNotifier with LocatorMixin { state = state.copyWith( orgs: [], selectedOrg: const Organization(), - selectedOrgStream: null, ); } logger.info('fetchLoginState: state = $state'); diff --git a/lib/pages/member/member_item.dart b/lib/pages/member/member_item.dart index 8fc2f73..f445871 100644 --- a/lib/pages/member/member_item.dart +++ b/lib/pages/member/member_item.dart @@ -11,16 +11,13 @@ import 'widgets/level_stars_widget.dart'; class MemberItem extends StatelessWidget { const MemberItem({ - this.id, + this.member, }); - final String id; + final Member member; @override Widget build(BuildContext context) { - final member = context - .select>((state) => state.members) - .firstWhere((m) => m.user.id == id); logger.info('MemberItem build: ${member.user.id}'); return ListTile( onTap: () { diff --git a/lib/pages/member/member_page.dart b/lib/pages/member/member_page.dart index 3be5afa..b9e19c5 100644 --- a/lib/pages/member/member_page.dart +++ b/lib/pages/member/member_page.dart @@ -10,6 +10,8 @@ class MemberPage extends StatelessWidget { @override Widget build(BuildContext context) { logger.info('MemberPage build'); + final memberStream = context.select>>( + (state) => state.membersStream); return Scaffold( appBar: AppBar( backgroundColor: Colors.white, @@ -19,18 +21,24 @@ class MemberPage extends StatelessWidget { style: TextStyle(color: Colors.black), ), ), - body: ListView.builder( - itemCount: - context.select((state) => state.members.length), - itemBuilder: (_, index) => Builder( - builder: (context) => MemberItem( - id: context - .select((state) => state.members[index]) - .user - .id, - ), - ), - ), + body: (memberStream == null) + ? const Text('組織を選択してください.') + : StreamBuilder( + stream: memberStream, + builder: (BuildContext _, AsyncSnapshot> snapshot) { + if (!snapshot.hasData) { + return const Text('Loading...'); + } + return ListView.builder( + itemCount: snapshot.data.length, + itemBuilder: (_, index) => Builder( + builder: (context) => MemberItem( + member: snapshot.data[index], + ), + ), + ); + }, + ), ); } } diff --git a/lib/pages/member/member_state.dart b/lib/pages/member/member_state.dart index faf5d18..5f36735 100644 --- a/lib/pages/member/member_state.dart +++ b/lib/pages/member/member_state.dart @@ -8,5 +8,6 @@ part 'member_state.freezed.dart'; abstract class MemberState with _$MemberState { const factory MemberState({ List members, + Stream> membersStream, }) = _MemberState; } diff --git a/lib/pages/member/member_state.freezed.dart b/lib/pages/member/member_state.freezed.dart index a55c517..675a063 100644 --- a/lib/pages/member/member_state.freezed.dart +++ b/lib/pages/member/member_state.freezed.dart @@ -14,9 +14,11 @@ class _$MemberStateTearOff { const _$MemberStateTearOff(); // ignore: unused_element - _MemberState call({List members}) { + _MemberState call( + {List members, Stream> membersStream}) { return _MemberState( members: members, + membersStream: membersStream, ); } } @@ -28,6 +30,7 @@ const $MemberState = _$MemberStateTearOff(); /// @nodoc mixin _$MemberState { List get members; + Stream> get membersStream; $MemberStateCopyWith get copyWith; } @@ -37,7 +40,7 @@ abstract class $MemberStateCopyWith<$Res> { factory $MemberStateCopyWith( MemberState value, $Res Function(MemberState) then) = _$MemberStateCopyWithImpl<$Res>; - $Res call({List members}); + $Res call({List members, Stream> membersStream}); } /// @nodoc @@ -51,9 +54,13 @@ class _$MemberStateCopyWithImpl<$Res> implements $MemberStateCopyWith<$Res> { @override $Res call({ Object members = freezed, + Object membersStream = freezed, }) { return _then(_value.copyWith( members: members == freezed ? _value.members : members as List, + membersStream: membersStream == freezed + ? _value.membersStream + : membersStream as Stream>, )); } } @@ -65,7 +72,7 @@ abstract class _$MemberStateCopyWith<$Res> _MemberState value, $Res Function(_MemberState) then) = __$MemberStateCopyWithImpl<$Res>; @override - $Res call({List members}); + $Res call({List members, Stream> membersStream}); } /// @nodoc @@ -81,23 +88,29 @@ class __$MemberStateCopyWithImpl<$Res> extends _$MemberStateCopyWithImpl<$Res> @override $Res call({ Object members = freezed, + Object membersStream = freezed, }) { return _then(_MemberState( members: members == freezed ? _value.members : members as List, + membersStream: membersStream == freezed + ? _value.membersStream + : membersStream as Stream>, )); } } /// @nodoc class _$_MemberState with DiagnosticableTreeMixin implements _MemberState { - const _$_MemberState({this.members}); + const _$_MemberState({this.members, this.membersStream}); @override final List members; + @override + final Stream> membersStream; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'MemberState(members: $members)'; + return 'MemberState(members: $members, membersStream: $membersStream)'; } @override @@ -105,7 +118,8 @@ class _$_MemberState with DiagnosticableTreeMixin implements _MemberState { super.debugFillProperties(properties); properties ..add(DiagnosticsProperty('type', 'MemberState')) - ..add(DiagnosticsProperty('members', members)); + ..add(DiagnosticsProperty('members', members)) + ..add(DiagnosticsProperty('membersStream', membersStream)); } @override @@ -113,12 +127,18 @@ class _$_MemberState with DiagnosticableTreeMixin implements _MemberState { return identical(this, other) || (other is _MemberState && (identical(other.members, members) || - const DeepCollectionEquality().equals(other.members, members))); + const DeepCollectionEquality() + .equals(other.members, members)) && + (identical(other.membersStream, membersStream) || + const DeepCollectionEquality() + .equals(other.membersStream, membersStream))); } @override int get hashCode => - runtimeType.hashCode ^ const DeepCollectionEquality().hash(members); + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(members) ^ + const DeepCollectionEquality().hash(membersStream); @override _$MemberStateCopyWith<_MemberState> get copyWith => @@ -126,10 +146,14 @@ class _$_MemberState with DiagnosticableTreeMixin implements _MemberState { } abstract class _MemberState implements MemberState { - const factory _MemberState({List members}) = _$_MemberState; + const factory _MemberState( + {List members, + Stream> membersStream}) = _$_MemberState; @override List get members; @override + Stream> get membersStream; + @override _$MemberStateCopyWith<_MemberState> get copyWith; } diff --git a/lib/pages/member/member_state_controller.dart b/lib/pages/member/member_state_controller.dart index a803619..5c8d3f2 100644 --- a/lib/pages/member/member_state_controller.dart +++ b/lib/pages/member/member_state_controller.dart @@ -1,5 +1,6 @@ import 'package:shiftend/pages/login/login_state.dart'; import 'package:shiftend/repositories/interfaces/organization_repository_interface.dart'; +import 'package:shiftend/util/logger.dart'; import 'package:state_notifier/state_notifier.dart'; import 'member_state.dart'; @@ -14,10 +15,13 @@ class MemberStateController extends StateNotifier @override void initState() { - state = state.copyWith(members: loginState.selectedOrg.members); + state = state.copyWith( + members: loginState.selectedOrg.members, + membersStream: loginState.selectedOrgStream?.map((org) => org.members), + ); } - void changeLevel(String id, double userLevel) { + Future changeLevel(String id, double userLevel) async { if (validateLevel(userLevel)) { final newMembers = state.members.map((member) { if (member.user.id == id) { @@ -26,7 +30,9 @@ class MemberStateController extends StateNotifier return member; }).toList(); state = state.copyWith(members: newMembers); - orgRepo.update(loginState.selectedOrg.copyWith(members: state.members)); + await orgRepo.update(loginState.selectedOrg.copyWith( + members: state.members, + )); } } From 14539519c65745b8d12257bfb40419a8c402a287 Mon Sep 17 00:00:00 2001 From: kouki Date: Wed, 14 Oct 2020 13:49:34 +0900 Subject: [PATCH 5/6] fix analyze --- lib/pages/login/login_state_controller.dart | 2 +- lib/pages/member/member_state_controller.dart | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/pages/login/login_state_controller.dart b/lib/pages/login/login_state_controller.dart index 5b09027..d65b8b3 100644 --- a/lib/pages/login/login_state_controller.dart +++ b/lib/pages/login/login_state_controller.dart @@ -8,7 +8,7 @@ import 'package:state_notifier/state_notifier.dart'; import 'login_state.dart'; class LoginStateController extends StateNotifier with LocatorMixin { - LoginStateController() : super(LoginState()); + LoginStateController() : super(const LoginState()); UserRepositoryInterface get userRepository => read(); OrganizationRepositoryInterface get orgRepository => diff --git a/lib/pages/member/member_state_controller.dart b/lib/pages/member/member_state_controller.dart index 5c8d3f2..8b14b2d 100644 --- a/lib/pages/member/member_state_controller.dart +++ b/lib/pages/member/member_state_controller.dart @@ -1,6 +1,5 @@ import 'package:shiftend/pages/login/login_state.dart'; import 'package:shiftend/repositories/interfaces/organization_repository_interface.dart'; -import 'package:shiftend/util/logger.dart'; import 'package:state_notifier/state_notifier.dart'; import 'member_state.dart'; From 048aecd00daa94aa93261bf4fd2c1ee171da6274 Mon Sep 17 00:00:00 2001 From: kouki Date: Wed, 14 Oct 2020 13:51:12 +0900 Subject: [PATCH 6/6] =?UTF-8?q?mock=E3=81=AEgetOrgStream=E3=82=92=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/repositories/mocks/organization_repository_mock.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/repositories/mocks/organization_repository_mock.dart b/lib/repositories/mocks/organization_repository_mock.dart index 219c1cc..eabadab 100644 --- a/lib/repositories/mocks/organization_repository_mock.dart +++ b/lib/repositories/mocks/organization_repository_mock.dart @@ -79,8 +79,7 @@ class OrganizationRepositoryMock extends OrganizationRepositoryInterface { } @override - Stream getOrgStream(String id) { - // TODO: implement getOrgStream - throw UnimplementedError(); + Stream getOrgStream(String id) async* { + yield await getOrganization(id); } }