Improvements:

- Fetch message indicator when startup
This commit is contained in:
Linloir 2022-10-22 00:35:46 +08:00
parent ba452c7fd8
commit ba59d23484
No known key found for this signature in database
GPG Key ID: 58EEB209A0F2C366
4 changed files with 98 additions and 23 deletions

View File

@ -1,7 +1,7 @@
/* /*
* @Author : Linloir * @Author : Linloir
* @Date : 2022-10-13 14:02:28 * @Date : 2022-10-13 14:02:28
* @LastEditTime : 2022-10-17 19:26:13 * @LastEditTime : 2022-10-21 23:31:43
* @Description : * @Description :
*/ */
@ -9,8 +9,10 @@ import 'dart:async';
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tcp_client/home/cubit/home_state.dart'; import 'package:tcp_client/home/cubit/home_state.dart';
import 'package:tcp_client/repositories/local_service_repository/local_service_repository.dart'; import 'package:tcp_client/repositories/local_service_repository/local_service_repository.dart';
import 'package:tcp_client/repositories/tcp_repository/models/tcp_request.dart';
import 'package:tcp_client/repositories/tcp_repository/models/tcp_response.dart'; import 'package:tcp_client/repositories/tcp_repository/models/tcp_response.dart';
import 'package:tcp_client/repositories/tcp_repository/tcp_repository.dart'; import 'package:tcp_client/repositories/tcp_repository/tcp_repository.dart';
@ -19,11 +21,41 @@ class HomeCubit extends Cubit<HomeState> {
required this.localServiceRepository, required this.localServiceRepository,
required this.tcpRepository, required this.tcpRepository,
required this.pageController required this.pageController
}): super(const HomeState(page: HomePagePosition.message)) { }): super(const HomeState(page: HomePagePosition.message, status: HomePageStatus.initializing)) {
pageController.addListener(() { pageController.addListener(() {
emit(state.copyWith(page: HomePagePosition.fromValue((pageController.page ?? 0).round()))); emit(state.copyWith(page: HomePagePosition.fromValue((pageController.page ?? 0).round())));
}); });
subscription = tcpRepository.responseStreamBroadcast.listen(_onTCPResponse); subscription = tcpRepository.responseStreamBroadcast.listen(_onTCPResponse);
Future(() async {
// var cloned = await tcpRepository.clone();
// cloned.pushRequest(FetchMessageRequest(
// token: (await SharedPreferences.getInstance()).getInt('token')
// ));
// await for(var response in cloned.responseStreamBroadcast) {
// if(response.type == TCPResponseType.fetchMessage) {
// if(response.status == TCPResponseStatus.ok) {
// response as FetchMessageResponse;
// localServiceRepository.storeMessages(response.messages);
// break;
// }
// }
// }
// cloned.dispose();
tcpRepository.pushRequest(FetchMessageRequest(
token: (await SharedPreferences.getInstance()).getInt('token')
));
await for(var response in tcpRepository.responseStreamBroadcast) {
if(response.type == TCPResponseType.fetchMessage) {
if(response.status == TCPResponseStatus.ok) {
response as FetchMessageResponse;
localServiceRepository.storeMessages(response.messages);
break;
}
}
}
}).then((_) {
emit(state.copyWith(status: HomePageStatus.done));
});
} }
final LocalServiceRepository localServiceRepository; final LocalServiceRepository localServiceRepository;
@ -40,6 +72,9 @@ class HomeCubit extends Cubit<HomeState> {
} }
void _onTCPResponse(TCPResponse response) { void _onTCPResponse(TCPResponse response) {
if(response.status == TCPResponseStatus.err) {
return;
}
switch(response.type) { switch(response.type) {
case TCPResponseType.forwardMessage: { case TCPResponseType.forwardMessage: {
response as ForwardMessageResponse; response as ForwardMessageResponse;

View File

@ -1,12 +1,14 @@
/* /*
* @Author : Linloir * @Author : Linloir
* @Date : 2022-10-13 14:02:24 * @Date : 2022-10-13 14:02:24
* @LastEditTime : 2022-10-13 16:55:05 * @LastEditTime : 2022-10-21 23:28:33
* @Description : * @Description :
*/ */
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
enum HomePageStatus { initializing, done }
enum HomePagePosition { enum HomePagePosition {
message(0), message(0),
contact(1), contact(1),
@ -26,13 +28,14 @@ enum HomePagePosition {
class HomeState extends Equatable { class HomeState extends Equatable {
final HomePagePosition page; final HomePagePosition page;
final HomePageStatus status;
const HomeState({required this.page}); const HomeState({required this.page, required this.status});
HomeState copyWith({HomePagePosition? page}) { HomeState copyWith({HomePagePosition? page, HomePageStatus? status}) {
return HomeState(page: page ?? this.page); return HomeState(page: page ?? this.page, status: status ?? this.status);
} }
@override @override
List<Object> get props => [page]; List<Object> get props => [page, status];
} }

View File

@ -1,7 +1,7 @@
/* /*
* @Author : Linloir * @Author : Linloir
* @Date : 2022-10-11 11:05:08 * @Date : 2022-10-11 11:05:08
* @LastEditTime : 2022-10-19 11:08:50 * @LastEditTime : 2022-10-21 23:56:24
* @Description : * @Description :
*/ */
@ -119,16 +119,56 @@ class HomePageView extends StatelessWidget {
) )
], ],
), ),
body: Center( body: BlocBuilder<HomeCubit, HomeState>(
child: BlocBuilder<HomeCubit, HomeState>( builder:(context, state) => Stack(
builder:(context, state) => PageView( children: [
controller: context.read<HomeCubit>().pageController, Positioned.fill(
children: [ child: Center(
MessagePage(), child: PageView(
const ContactPage(), controller: context.read<HomeCubit>().pageController,
MyProfilePage(userID: userID) children: [
], MessagePage(),
), const ContactPage(),
MyProfilePage(userID: userID)
],
),
),
),
if(state.status == HomePageStatus.initializing)
Positioned.fill(
child: AbsorbPointer(
child: Center(
child: Container(
decoration: BoxDecoration(
color: Colors.grey[800]!.withOpacity(0.5),
borderRadius: BorderRadius.circular(8.0)
),
height: 200,
width: 200,
alignment: Alignment.center,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: const [
CircularProgressIndicator(
color: Colors.white,
strokeWidth: 4.0,
),
SizedBox(height: 16.0,),
Text(
'Fetching Messages',
style: TextStyle(
color: Colors.white,
fontSize: 18.0
),
)
],
),
),
),
),
),
]
), ),
), ),
bottomNavigationBar: BlocBuilder<HomeCubit, HomeState>( bottomNavigationBar: BlocBuilder<HomeCubit, HomeState>(

View File

@ -1,7 +1,7 @@
/* /*
* @Author : Linloir * @Author : Linloir
* @Date : 2022-10-12 23:38:31 * @Date : 2022-10-12 23:38:31
* @LastEditTime : 2022-10-19 18:02:22 * @LastEditTime : 2022-10-21 23:14:02
* @Description : * @Description :
*/ */
@ -40,10 +40,7 @@ class MessageListCubit extends Cubit<MessageListState> {
} }
} }
return msgList; return msgList;
}).then((msgList) => emit(state.updateWithList(orderedNewMessages: msgList))) }).then((msgList) => emit(state.updateWithList(orderedNewMessages: msgList)));
.then((_) async => tcpRepository.pushRequest(FetchMessageRequest(
token: (await SharedPreferences.getInstance()).getInt('token'))
));
} }
final LocalServiceRepository localServiceRepository; final LocalServiceRepository localServiceRepository;