diff --git a/android/app/build.gradle b/android/app/build.gradle
index 217c464..08bb639 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
- compileSdkVersion flutter.compileSdkVersion
+ compileSdkVersion 33
ndkVersion flutter.ndkVersion
compileOptions {
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 2ae2c18..085f68b 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -31,4 +31,5 @@
android:name="flutterEmbedding"
android:value="2" />
+
diff --git a/lib/chat/cubit/chat_cubit.dart b/lib/chat/cubit/chat_cubit.dart
index 845fa1f..ee65cfd 100644
--- a/lib/chat/cubit/chat_cubit.dart
+++ b/lib/chat/cubit/chat_cubit.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-13 14:03:56
- * @LastEditTime : 2022-10-15 11:45:04
+ * @LastEditTime : 2022-10-17 17:43:55
* @Description :
*/
@@ -107,13 +107,13 @@ class ChatCubit extends Cubit {
}
Future fetchFile({required String messageMd5}) async {
- var newHistory = [...state.chatHistory];
- var index = newHistory.indexWhere((e) => e.message.contentmd5 == messageMd5);
- if(index != -1) {
- newHistory[index] = newHistory[index].copyWith(
- status: ChatHistoryStatus.done
- );
- }
+ // var newHistory = [...state.chatHistory];
+ // var index = newHistory.indexWhere((e) => e.message.contentmd5 == messageMd5);
+ // if(index != -1) {
+ // newHistory[index] = newHistory[index].copyWith(
+ // status: ChatHistoryStatus.done
+ // );
+ // }
var clonedTCPRepository = await tcpRepository.clone();
clonedTCPRepository.pushRequest(FetchFileRequest(
msgmd5: messageMd5,
@@ -147,6 +147,7 @@ class ChatCubit extends Cubit {
}
emit(state.copyWith(chatHistory: newHistory));
}
+ clonedTCPRepository.dispose();
}
});
fileFetchSubscriptionMap.addEntries([MapEntry(messageMd5, subscription)]);
diff --git a/lib/home/cubit/home_cubit.dart b/lib/home/cubit/home_cubit.dart
index 2c22bf8..38f57d2 100644
--- a/lib/home/cubit/home_cubit.dart
+++ b/lib/home/cubit/home_cubit.dart
@@ -1,11 +1,12 @@
/*
* @Author : Linloir
* @Date : 2022-10-13 14:02:28
- * @LastEditTime : 2022-10-13 23:02:04
+ * @LastEditTime : 2022-10-17 17:00:45
* @Description :
*/
import 'package:bloc/bloc.dart';
+import 'package:flutter/cupertino.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/tcp_repository.dart';
@@ -14,12 +15,22 @@ class HomeCubit extends Cubit {
HomeCubit({
required this.localServiceRepository,
required this.tcpRepository,
- }): super(const HomeState(page: HomePagePosition.message));
+ required this.pageController
+ }): super(const HomeState(page: HomePagePosition.message)) {
+ pageController.addListener(() {
+ emit(state.copyWith(page: HomePagePosition.fromValue((pageController.page ?? 0).round())));
+ });
+ }
final LocalServiceRepository localServiceRepository;
final TCPRepository tcpRepository;
+ final PageController pageController;
void switchPage(HomePagePosition newPage) {
- emit(state.copyWith(page: newPage));
+ pageController.animateToPage(
+ newPage.value,
+ duration: const Duration(milliseconds: 500),
+ curve: Curves.easeInOutCubicEmphasized
+ );
}
}
diff --git a/lib/home/home_page.dart b/lib/home/home_page.dart
index 70d3aa7..dc8fab8 100644
--- a/lib/home/home_page.dart
+++ b/lib/home/home_page.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-11 11:05:08
- * @LastEditTime : 2022-10-14 15:57:30
+ * @LastEditTime : 2022-10-17 16:57:57
* @Description :
*/
@@ -72,7 +72,8 @@ class HomePage extends StatelessWidget {
BlocProvider(
create: (context) => HomeCubit(
localServiceRepository: localServiceRepository,
- tcpRepository: tcpRepository
+ tcpRepository: tcpRepository,
+ pageController: PageController()
),
)
],
@@ -83,64 +84,75 @@ class HomePage extends StatelessWidget {
}
class HomePageView extends StatelessWidget {
- HomePageView({
+ const HomePageView({
required this.userID,
super.key
});
- final PageController _controller = PageController();
final int userID;
@override
Widget build(BuildContext context) {
- return BlocListener(
- listenWhen:(previous, current) => current.page != previous.page,
- listener: (context, state) {
- _controller.animateToPage(
- state.page.value,
- duration: const Duration(milliseconds: 375),
- curve: Curves.easeInOutCubicEmphasized
- );
- },
- child: Scaffold(
- appBar: AppBar(
- title: BlocBuilder(
- builder: (context, state) {
- return Text(
- state.page.literal,
- style: const TextStyle(
- fontWeight: FontWeight.bold
- ),
- );
- },
- ),
- actions: [
- IconButton(
- icon: const Icon(Icons.search_rounded),
- onPressed: () {
- Navigator.of(context).push(SearchPage.route(
- localServiceRepository: context.read(),
- tcpRepository: context.read(),
- userRepository: context.read()
- ));
- },
- )
- ],
+ return Scaffold(
+ appBar: AppBar(
+ title: BlocBuilder(
+ builder: (context, state) {
+ return Text(
+ state.page.literal,
+ style: const TextStyle(
+ fontWeight: FontWeight.bold
+ ),
+ );
+ },
),
- body: Center(
- child: BlocBuilder(
- builder:(context, state) => PageView(
- controller: _controller,
- onPageChanged: (value) => context.read().switchPage(HomePagePosition.fromValue(value)),
- children: [
- const MessagePage(),
- const ContactPage(),
- MyProfilePage(userID: userID)
- ],
- ),
+ actions: [
+ IconButton(
+ icon: const Icon(Icons.search_rounded),
+ onPressed: () {
+ Navigator.of(context).push(SearchPage.route(
+ localServiceRepository: context.read(),
+ tcpRepository: context.read(),
+ userRepository: context.read()
+ ));
+ },
+ )
+ ],
+ ),
+ body: Center(
+ child: BlocBuilder(
+ builder:(context, state) => PageView(
+ controller: context.read().pageController,
+ children: [
+ MessagePage(),
+ const ContactPage(),
+ MyProfilePage(userID: userID)
+ ],
),
),
),
+ bottomNavigationBar: BlocBuilder(
+ builder: (context, state) => BottomNavigationBar(
+ items: const [
+ BottomNavigationBarItem(
+ activeIcon: Icon(Icons.message_rounded),
+ icon: Icon(Icons.message_outlined),
+ label: 'Message'
+ ),
+ BottomNavigationBarItem(
+ activeIcon: Icon(Icons.contacts_rounded),
+ icon: Icon(Icons.contacts_outlined),
+ label: 'Contacts'
+ ),
+ BottomNavigationBarItem(
+ activeIcon: Icon(Icons.person_rounded),
+ icon: Icon(Icons.person_outline_rounded),
+ label: 'Me'
+ ),
+ ],
+ currentIndex: state.page.value,
+ onTap: (value) => context.read().switchPage(HomePagePosition.fromValue(value))
+ ),
+ )
);
}
}
\ No newline at end of file
diff --git a/lib/home/view/contact_page/contact_page.dart b/lib/home/view/contact_page/contact_page.dart
index f400ab4..67a081c 100644
--- a/lib/home/view/contact_page/contact_page.dart
+++ b/lib/home/view/contact_page/contact_page.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 23:36:07
- * @LastEditTime : 2022-10-14 11:45:35
+ * @LastEditTime : 2022-10-17 17:35:05
* @Description :
*/
@@ -21,15 +21,16 @@ class ContactPage extends StatelessWidget {
return Container(
child: BlocBuilder(
builder: (context, state) {
+ var indexedData = state.indexedData;
return AzListView(
- data: state.indexedData,
- itemCount: state.contacts.length,
+ data: indexedData,
+ itemCount: indexedData.length,
itemBuilder: (context, index) {
return ContactTile(
- userInfo: state.contacts[index],
+ userInfo: (indexedData[index] as ContactModel).userInfo,
);
},
- physics: const BouncingScrollPhysics(),
+ physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
susItemBuilder: (context, index) {
return Container(
height: 40,
@@ -38,7 +39,7 @@ class ContactPage extends StatelessWidget {
color: Colors.grey[200],
alignment: Alignment.centerLeft,
child: Text(
- ContactModel(userInfo: state.contacts[index]).getSuspensionTag(),
+ indexedData[index].getSuspensionTag(),
softWrap: false,
style: TextStyle(
fontSize: 14.0,
diff --git a/lib/home/view/contact_page/cubit/contact_state.dart b/lib/home/view/contact_page/cubit/contact_state.dart
index 5887c3d..b909f02 100644
--- a/lib/home/view/contact_page/cubit/contact_state.dart
+++ b/lib/home/view/contact_page/cubit/contact_state.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-13 14:01:39
- * @LastEditTime : 2022-10-13 15:51:23
+ * @LastEditTime : 2022-10-17 17:28:33
* @Description :
*/
@@ -25,7 +25,8 @@ class ContactState extends Equatable {
List get indexedData {
var indexedList = contacts.map((e) => ContactModel(userInfo: e)).toList();
- SuspensionUtil.sortListBySuspensionTag(indexedList);
+ indexedList.sort((a, b) => a.getSuspensionTag().compareTo(b.getSuspensionTag()));
+ // SuspensionUtil.sortListBySuspensionTag(indexedList);
SuspensionUtil.setShowSuspensionStatus(indexedList);
return indexedList;
}
diff --git a/lib/home/view/contact_page/models/contact_model.dart b/lib/home/view/contact_page/models/contact_model.dart
index c82930e..e88617f 100644
--- a/lib/home/view/contact_page/models/contact_model.dart
+++ b/lib/home/view/contact_page/models/contact_model.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-13 15:34:08
- * @LastEditTime : 2022-10-13 15:41:24
+ * @LastEditTime : 2022-10-17 17:20:47
* @Description :
*/
@@ -17,7 +17,7 @@ class ContactModel extends ISuspensionBean {
@override
String getSuspensionTag() {
var pinyin = PinyinHelper.getPinyinE(userInfo.userName);
- var tag = pinyin.substring(0, 1);
+ var tag = pinyin.substring(0, 1).toUpperCase();
if(!RegExp('[A-Z]').hasMatch(tag)) {
tag = '#';
}
diff --git a/lib/home/view/contact_page/view/contact_tile.dart b/lib/home/view/contact_page/view/contact_tile.dart
index 0a4cc5f..09eb6b1 100644
--- a/lib/home/view/contact_page/view/contact_tile.dart
+++ b/lib/home/view/contact_page/view/contact_tile.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-13 14:02:00
- * @LastEditTime : 2022-10-14 11:59:48
+ * @LastEditTime : 2022-10-17 17:19:50
* @Description :
*/
@@ -53,14 +53,18 @@ class ContactTile extends StatelessWidget {
),
child: Row(
children: [
- UserAvatar(userid: userInfo.userID),
+ IgnorePointer(
+ child: UserAvatar(userid: userInfo.userID),
+ ),
const SizedBox(width: 12,),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0
),
- child: UserNameText(userid: userInfo.userID,)
+ child: IgnorePointer(
+ child: UserNameText(userid: userInfo.userID,)
+ ),
)
),
],
diff --git a/lib/home/view/message_page/cubit/msg_list_cubit.dart b/lib/home/view/message_page/cubit/msg_list_cubit.dart
index 3060161..c74b1ed 100644
--- a/lib/home/view/message_page/cubit/msg_list_cubit.dart
+++ b/lib/home/view/message_page/cubit/msg_list_cubit.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 23:38:31
- * @LastEditTime : 2022-10-15 10:29:05
+ * @LastEditTime : 2022-10-17 17:15:12
* @Description :
*/
@@ -12,6 +12,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:tcp_client/home/view/message_page/cubit/msg_list_state.dart';
import 'package:tcp_client/home/view/message_page/models/message_info.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';
@@ -21,18 +22,50 @@ class MessageListCubit extends Cubit {
required this.tcpRepository
}): super(MessageListState.empty()) {
subscription = tcpRepository.responseStreamBroadcast.listen(_onResponse);
+ Future>(() async {
+ var pref = await SharedPreferences.getInstance();
+ var userID = pref.getInt('userid');
+ var msgUserList = pref.getStringList('${userID}msg');
+ List msgList = [];
+ if(msgUserList != null) {
+ for(var user in msgUserList) {
+ var targetUserID = int.parse(user);
+ var history = await localServiceRepository.fetchMessageHistory(userID: targetUserID, position: 0, num: 1);
+ if(history.isEmpty) {
+ msgList.add(MessageInfo(targetUser: targetUserID));
+ }
+ else {
+ msgList.add(MessageInfo(targetUser: targetUserID, message: history[0]));
+ }
+ }
+ }
+ return msgList;
+ }).then((msgList) => emit(state.updateWithList(orderedNewMessages: msgList)))
+ .then((_) async => tcpRepository.pushRequest(FetchMessageRequest(
+ token: (await SharedPreferences.getInstance()).getInt('token'))
+ ));
}
final LocalServiceRepository localServiceRepository;
final TCPRepository tcpRepository;
late final StreamSubscription subscription;
- void addEmptyMessageOf({required int targetUser}) {
+ void addEmptyMessageOf({required int targetUser}) async {
if(state.messageList.any((element) => element.targetUser == targetUser)) {
return;
}
- var newList = [MessageInfo(targetUser: targetUser)];
- emit(MessageListState(messageList: newList..addAll(state.messageList)));
+ var newList = [MessageInfo(targetUser: targetUser), ...state.messageList];
+ emit(MessageListState(messageList: newList));
+ var pref = await SharedPreferences.getInstance();
+ var currentUserID = pref.getInt('userid');
+ var msgUserList = pref.getStringList('${currentUserID}msg') ?? [];
+ msgUserList.remove('$targetUser');
+ msgUserList.insert(0, '$targetUser');
+ pref.setStringList('${currentUserID}msg', msgUserList);
+ }
+
+ Future refresh() async {
+ tcpRepository.pushRequest(FetchMessageRequest(token: (await SharedPreferences.getInstance()).getInt('token')));
}
Future _onResponse(TCPResponse response) async {
@@ -42,10 +75,12 @@ class MessageListCubit extends Cubit {
if(response.status == TCPResponseStatus.ok) {
var message = await localServiceRepository.fetchMessage(msgmd5: response.md5encoded!);
if(message != null) {
- var curUser = (await SharedPreferences.getInstance()).getInt('userid');
+ var pref = await SharedPreferences.getInstance();
+ var currentUserID = pref.getInt('userid');
+ var targetUser = message.senderID == currentUserID ? message.recieverID : message.senderID;
emit(state.updateWithSingle(messageInfo: MessageInfo(
message: message,
- targetUser: message.senderID == curUser ? message.recieverID : message.senderID
+ targetUser: targetUser
)));
}
}
@@ -76,6 +111,9 @@ class MessageListCubit extends Cubit {
//Use the meessage list to create new state
emit(state.updateWithList(orderedNewMessages: latestMessages));
+
+ var msgUserList = state.messageList.map((e) => e.targetUser.toString()).toList();
+ pref.setStringList('${curUser}msg', msgUserList);
break;
}
@@ -93,6 +131,10 @@ class MessageListCubit extends Cubit {
message: response.message
)
));
+ var msgUserList = pref.getStringList('${curUser}msg') ?? [];
+ msgUserList.remove('$targetUser');
+ msgUserList.insert(0, '$targetUser');
+ pref.setStringList('${curUser}msg', msgUserList);
break;
}
default: break;
diff --git a/lib/home/view/message_page/cubit/msg_list_state.dart b/lib/home/view/message_page/cubit/msg_list_state.dart
index 0d3859b..1e1b631 100644
--- a/lib/home/view/message_page/cubit/msg_list_state.dart
+++ b/lib/home/view/message_page/cubit/msg_list_state.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-12 23:37:49
- * @LastEditTime : 2022-10-15 00:55:49
+ * @LastEditTime : 2022-10-17 13:10:49
* @Description :
*/
@@ -78,12 +78,12 @@ class MessageListState extends Equatable {
}
while(insertListIndex < orderedNewMessages.length) {
if(addedUsers.contains(orderedNewMessages[insertListIndex].targetUser)) {
- origListIndex += 1;
+ insertListIndex += 1;
continue;
}
newList.add(orderedNewMessages[insertListIndex]);
addedUsers.add(orderedNewMessages[insertListIndex].targetUser);
- origListIndex += 1;
+ insertListIndex += 1;
continue;
}
diff --git a/lib/home/view/message_page/mesage_page.dart b/lib/home/view/message_page/mesage_page.dart
index 6ab6633..298a1ec 100644
--- a/lib/home/view/message_page/mesage_page.dart
+++ b/lib/home/view/message_page/mesage_page.dart
@@ -1,24 +1,34 @@
/*
* @Author : Linloir
* @Date : 2022-10-11 11:05:18
- * @LastEditTime : 2022-10-15 10:20:43
+ * @LastEditTime : 2022-10-17 13:35:35
* @Description :
*/
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
import 'package:tcp_client/home/view/message_page/cubit/msg_list_cubit.dart';
import 'package:tcp_client/home/view/message_page/cubit/msg_list_state.dart';
import 'package:tcp_client/home/view/message_page/view/message_tile.dart';
class MessagePage extends StatelessWidget {
- const MessagePage({super.key});
+ MessagePage({super.key});
+
+ final RefreshController _refreshController = RefreshController(initialRefresh: false);
@override
Widget build(BuildContext context) {
return BlocBuilder(
builder: (context, state) {
- return ListView.separated(
+ return SmartRefresher(
+ controller: _refreshController,
+ onRefresh: () async {
+ await context.read().refresh();
+ _refreshController.refreshCompleted();
+ },
+ child: ListView.separated(
+ physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
itemBuilder: (context, index) {
return MessageTile(
userID: state.messageList[index].targetUser,
@@ -31,7 +41,8 @@ class MessagePage extends StatelessWidget {
);
},
itemCount: state.messageList.length
- );
+ ),
+ );
}
);
}
diff --git a/lib/home/view/message_page/view/message_tile.dart b/lib/home/view/message_page/view/message_tile.dart
index 4723240..7d2d58c 100644
--- a/lib/home/view/message_page/view/message_tile.dart
+++ b/lib/home/view/message_page/view/message_tile.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-13 13:17:52
- * @LastEditTime : 2022-10-15 01:05:11
+ * @LastEditTime : 2022-10-17 17:18:22
* @Description :
*/
@@ -53,7 +53,9 @@ class MessageTile extends StatelessWidget {
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
- UserAvatar(userid: userID),
+ IgnorePointer(
+ child: UserAvatar(userid: userID),
+ ),
// if(userInfo.avatarEncoded != null && userInfo.avatarEncoded!.isEmpty)
// Container(
// decoration: BoxDecoration(
@@ -97,16 +99,20 @@ class MessageTile extends StatelessWidget {
vertical: 2.0,
horizontal: 0
),
- child: UserNameText(userid: userID, fontWeight: FontWeight.bold,)
+ child: IgnorePointer(
+ child: UserNameText(userid: userID, fontWeight: FontWeight.bold,),
+ ),
),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 2.0
),
- child: Text(
- message?.contentDecoded ?? '',
- style: const TextStyle(
- fontSize: 16,
+ child: IgnorePointer(
+ child: Text(
+ message?.contentDecoded ?? '',
+ style: const TextStyle(
+ fontSize: 16,
+ ),
),
),
),
@@ -122,8 +128,10 @@ class MessageTile extends StatelessWidget {
),
child: Align(
alignment: Alignment.topCenter,
- child: Text(
- getTimeStamp(message!.timeStamp)
+ child: IgnorePointer(
+ child: Text(
+ getTimeStamp(message!.timeStamp)
+ ),
),
),
),
diff --git a/lib/main.dart b/lib/main.dart
index c37984e..259c62c 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-10 08:04:53
- * @LastEditTime : 2022-10-14 11:45:01
+ * @LastEditTime : 2022-10-17 13:03:55
* @Description :
*/
import 'package:flutter/gestures.dart';
diff --git a/lib/repositories/local_service_repository/local_service_repository.dart b/lib/repositories/local_service_repository/local_service_repository.dart
index 627e427..7080f8f 100644
--- a/lib/repositories/local_service_repository/local_service_repository.dart
+++ b/lib/repositories/local_service_repository/local_service_repository.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-11 10:56:02
- * @LastEditTime : 2022-10-15 11:48:54
+ * @LastEditTime : 2022-10-17 13:01:35
* @Description : Local Service Repository
*/
@@ -15,8 +15,11 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:tcp_client/repositories/common_models/message.dart';
import 'package:tcp_client/repositories/common_models/userinfo.dart';
import 'package:tcp_client/repositories/local_service_repository/models/local_file.dart';
+//Windows platform
import 'package:sqflite_common/sqlite_api.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
+//Android platform
+// import 'package:sqflite/sqflite.dart';
class LocalServiceRepository {
late final Database _database;
@@ -26,13 +29,18 @@ class LocalServiceRepository {
}): _database = database;
static FutureOr _onDatabaseCreate(Database db, int version) async {
- await db.execute(
+ await db.transaction((txn) async {
+ await txn.execute(
'''
create table users (
userid integer primary key,
username text not null,
avatar text
);
+ '''
+ );
+ await txn.execute(
+ '''
create table msgs (
userid integer not null,
targetid integer not null,
@@ -42,18 +50,46 @@ class LocalServiceRepository {
md5encoded text primary key,
filemd5 text
);
+ '''
+ );
+ await txn.execute(
+ '''
create table files (
filemd5 text primary key,
dir text not null
);
'''
- );
+ );
+ });
+ // await db.execute(
+ // '''
+ // create table msgs (
+ // userid integer not null,
+ // targetid integer not null,
+ // contenttype text not null,
+ // content text not null,
+ // timestamp int not null,
+ // md5encoded text primary key,
+ // filemd5 text
+ // );
+ // create table users (
+ // userid integer primary key,
+ // username text not null,
+ // avatar text
+ // );
+ // create table files (
+ // filemd5 text primary key,
+ // dir text not null
+ // );
+ // '''
+ // );
}
static Future create({
UserInfo? currentUser,
required String databaseFilePath
}) async {
+ //Windows platform
var database = await databaseFactoryFfi.openDatabase(
databaseFilePath,
options: OpenDatabaseOptions(
@@ -61,6 +97,12 @@ class LocalServiceRepository {
onCreate: _onDatabaseCreate
)
);
+ //Android platform
+ // var database = await openDatabase(
+ // databaseFilePath,
+ // version: 1,
+ // onCreate: _onDatabaseCreate
+ // );
return LocalServiceRepository._internal(database: database);
}
diff --git a/lib/repositories/tcp_repository/tcp_repository.dart b/lib/repositories/tcp_repository/tcp_repository.dart
index 713d146..b4e57eb 100644
--- a/lib/repositories/tcp_repository/tcp_repository.dart
+++ b/lib/repositories/tcp_repository/tcp_repository.dart
@@ -1,7 +1,7 @@
/*
* @Author : Linloir
* @Date : 2022-10-11 09:42:05
- * @LastEditTime : 2022-10-15 11:06:05
+ * @LastEditTime : 2022-10-15 16:50:16
* @Description : TCP repository
*/
@@ -12,6 +12,7 @@ import 'dart:io';
import 'package:async/async.dart';
import 'package:crypto/crypto.dart';
import 'package:flutter/foundation.dart';
+import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tcp_client/repositories/common_models/message.dart';
import 'package:tcp_client/repositories/local_service_repository/models/local_file.dart';
@@ -138,15 +139,17 @@ class TCPRepository {
payloadLength = Uint8List.fromList(buffer.sublist(4, 8)).buffer.asInt32List()[0];
//Clear the length indicator bytes
buffer.removeRange(0, 8);
- //Create temp file to read payload (might be huge)
- Directory('${Directory.current.path}/.tmp').createSync();
//Create a pull stream for payload file
_payloadPullStreamController = StreamController();
//Create a future that listens to the status of the payload transmission
() {
var payloadPullStream = _payloadPullStreamController.stream;
- var tempFile = File('${Directory.current.path}/.tmp/${DateTime.now().microsecondsSinceEpoch}')..createSync();
Future(() async {
+ var documentDirectory = await getApplicationDocumentsDirectory();
+ //Create temp file to read payload (might be huge)
+ Directory('${documentDirectory.path}/ChatClient').createSync();
+ Directory('${documentDirectory.path}/ChatClient/.tmp').createSync();
+ var tempFile = File('${documentDirectory.path}/ChatClient/.tmp/${DateTime.now().microsecondsSinceEpoch}')..createSync();
await for(var data in payloadPullStream) {
await tempFile.writeAsBytes(data, mode: FileMode.append, flush: true);
}
diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift
index 14e6964..e9cf192 100644
--- a/macos/Flutter/GeneratedPluginRegistrant.swift
+++ b/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -7,8 +7,10 @@ import Foundation
import path_provider_macos
import shared_preferences_macos
+import sqflite
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
+ SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
}
diff --git a/pubspec.lock b/pubspec.lock
index e906a39..d114a15 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -312,13 +312,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.0.3"
- pull_to_refresh:
+ pull_to_refresh_flutter3:
dependency: "direct main"
description:
- name: pull_to_refresh
+ name: pull_to_refresh_flutter3
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.0.0"
+ version: "2.0.1"
scrollable_positioned_list:
dependency: transitive
description:
@@ -394,6 +394,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.9.0"
+ sqflite:
+ dependency: "direct main"
+ description:
+ name: sqflite
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.1.0+1"
sqflite_common:
dependency: "direct main"
description:
@@ -494,4 +501,4 @@ packages:
version: "0.2.0+2"
sdks:
dart: ">=2.18.2 <3.0.0"
- flutter: ">=3.0.0"
+ flutter: ">=3.3.0-0"
diff --git a/pubspec.yaml b/pubspec.yaml
index adb85ac..d66fc36 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -33,6 +33,7 @@ dependencies:
sdk: flutter
path_provider: ^2.0.11
+ sqflite: ^2.1.0+1
sqflite_common_ffi: ^2.1.1+1
sqflite_common: ^2.3.0
crypto: ^3.0.2
@@ -50,7 +51,7 @@ dependencies:
async: ^2.9.0
stream_transform: ^2.0.1
flutter_slidable: ^2.0.0
- pull_to_refresh: ^2.0.0
+ pull_to_refresh_flutter3: ^2.0.1
azlistview: ^2.0.0
lpinyin: ^2.0.3
easy_debounce: ^2.0.2+1