From e7f690159c8cd363a37bd1dc8ac90c9140cf7155 Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Mon, 17 Oct 2022 17:47:17 +0800 Subject: [PATCH] More Functions - message list persistence - bug fix for contact list tag --- android/app/build.gradle | 2 +- android/app/src/main/AndroidManifest.xml | 1 + lib/chat/cubit/chat_cubit.dart | 17 +-- lib/home/cubit/home_cubit.dart | 17 ++- lib/home/home_page.dart | 108 ++++++++++-------- lib/home/view/contact_page/contact_page.dart | 13 ++- .../contact_page/cubit/contact_state.dart | 5 +- .../contact_page/models/contact_model.dart | 4 +- .../view/contact_page/view/contact_tile.dart | 10 +- .../message_page/cubit/msg_list_cubit.dart | 54 ++++++++- .../message_page/cubit/msg_list_state.dart | 6 +- lib/home/view/message_page/mesage_page.dart | 19 ++- .../view/message_page/view/message_tile.dart | 26 +++-- lib/main.dart | 2 +- .../local_service_repository.dart | 48 +++++++- .../tcp_repository/tcp_repository.dart | 11 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 15 ++- pubspec.yaml | 3 +- 19 files changed, 255 insertions(+), 108 deletions(-) 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