Improvements:

- Fetch message indicator when startup
This commit is contained in:
Linloir 2022-10-22 00:35:46 +08:00
parent a3d4311479
commit 01e7685a4d
4 changed files with 98 additions and 23 deletions

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-13 14:02:28
* @LastEditTime : 2022-10-17 19:26:13
* @LastEditTime : 2022-10-21 23:31:43
* @Description :
*/
@ -9,8 +9,10 @@ import 'dart:async';
import 'package:bloc/bloc.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/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/tcp_repository.dart';
@ -19,11 +21,41 @@ class HomeCubit extends Cubit<HomeState> {
required this.localServiceRepository,
required this.tcpRepository,
required this.pageController
}): super(const HomeState(page: HomePagePosition.message)) {
}): super(const HomeState(page: HomePagePosition.message, status: HomePageStatus.initializing)) {
pageController.addListener(() {
emit(state.copyWith(page: HomePagePosition.fromValue((pageController.page ?? 0).round())));
});
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;
@ -40,6 +72,9 @@ class HomeCubit extends Cubit<HomeState> {
}
void _onTCPResponse(TCPResponse response) {
if(response.status == TCPResponseStatus.err) {
return;
}
switch(response.type) {
case TCPResponseType.forwardMessage: {
response as ForwardMessageResponse;

View File

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

View File

@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-11 11:05:08
* @LastEditTime : 2022-10-19 11:08:50
* @LastEditTime : 2022-10-21 23:56:24
* @Description :
*/
@ -119,16 +119,56 @@ class HomePageView extends StatelessWidget {
)
],
),
body: Center(
child: BlocBuilder<HomeCubit, HomeState>(
builder:(context, state) => PageView(
controller: context.read<HomeCubit>().pageController,
children: [
MessagePage(),
const ContactPage(),
MyProfilePage(userID: userID)
],
),
body: BlocBuilder<HomeCubit, HomeState>(
builder:(context, state) => Stack(
children: [
Positioned.fill(
child: Center(
child: PageView(
controller: context.read<HomeCubit>().pageController,
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>(

View File

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