diff --git a/flutter/android/app/build.gradle b/flutter/android/app/build.gradle
index 79bf6426a..a2a1a02a3 100644
--- a/flutter/android/app/build.gradle
+++ b/flutter/android/app/build.gradle
@@ -32,7 +32,7 @@ apply plugin: 'kotlin-android'
 apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
 
 android {
-    compileSdkVersion 31
+    compileSdkVersion 32
     sourceSets {
         main.java.srcDirs += 'src/main/kotlin'
     }
diff --git a/flutter/lib/models/chat_model.dart b/flutter/lib/models/chat_model.dart
index eaf8d2243..149b60a46 100644
--- a/flutter/lib/models/chat_model.dart
+++ b/flutter/lib/models/chat_model.dart
@@ -1,6 +1,6 @@
 import 'dart:convert';
 
-import 'package:dash_chat/dash_chat.dart';
+import 'package:dash_chat_2/dash_chat_2.dart';
 import 'package:flutter/material.dart';
 
 import '../widgets/overlay.dart';
@@ -11,8 +11,8 @@ class MessageBody {
   List<ChatMessage> chatMessages;
   MessageBody(this.chatUser, this.chatMessages);
 
-  void add(ChatMessage cm) {
-    this.chatMessages.add(cm);
+  void insert(ChatMessage cm) {
+    this.chatMessages.insert(0, cm);
   }
 
   void clear() {
@@ -24,19 +24,15 @@ class ChatModel with ChangeNotifier {
   static final clientModeID = -1;
 
   final ChatUser me = ChatUser(
-    uid: "",
-    name: "Me",
+    id: "",
+    firstName: "Me",
   );
 
   late final Map<int, MessageBody> _messages = Map()
     ..[clientModeID] = MessageBody(me, []);
 
-  final _scroller = ScrollController();
-
   var _currentID = clientModeID;
 
-  ScrollController get scroller => _scroller;
-
   Map<int, MessageBody> get messages => _messages;
 
   int get currentID => _currentID;
@@ -62,8 +58,8 @@ class ChatModel with ChangeNotifier {
             "Failed to changeCurrentID,remote user doesn't exist");
       }
       final chatUser = ChatUser(
-        uid: client.peerId,
-        name: client.name,
+        id: client.peerId,
+        firstName: client.name,
       );
       _messages[id] = MessageBody(chatUser, []);
       _currentID = id;
@@ -80,48 +76,39 @@ class ChatModel with ChangeNotifier {
     late final chatUser;
     if (id == clientModeID) {
       chatUser = ChatUser(
-        name: FFI.ffiModel.pi.username,
-        uid: FFI.getId(),
+        firstName: FFI.ffiModel.pi.username,
+        id: FFI.getId(),
       );
     } else {
       final client = FFI.serverModel.clients[id];
       if (client == null) {
         return debugPrint("Failed to receive msg,user doesn't exist");
       }
-      chatUser = ChatUser(uid: client.peerId, name: client.name);
+      chatUser = ChatUser(id: client.peerId, firstName: client.name);
     }
 
     if (!_messages.containsKey(id)) {
       _messages[id] = MessageBody(chatUser, []);
     }
-    _messages[id]!.add(ChatMessage(text: text, user: chatUser));
+    _messages[id]!.insert(
+        ChatMessage(text: text, user: chatUser, createdAt: DateTime.now()));
     _currentID = id;
     notifyListeners();
-    scrollToBottom();
-  }
-
-  scrollToBottom() {
-    Future.delayed(Duration(milliseconds: 500), () {
-      _scroller.animateTo(_scroller.position.maxScrollExtent,
-          duration: Duration(milliseconds: 200),
-          curve: Curves.fastLinearToSlowEaseIn);
-    });
   }
 
   send(ChatMessage message) {
-    if (message.text != null && message.text!.isNotEmpty) {
-      _messages[_currentID]?.add(message);
+    if (message.text.isNotEmpty) {
+      _messages[_currentID]?.insert(message);
       if (_currentID == clientModeID) {
-        FFI.setByName("chat_client_mode", message.text!);
+        FFI.setByName("chat_client_mode", message.text);
       } else {
         final msg = Map()
           ..["id"] = _currentID
-          ..["text"] = message.text!;
+          ..["text"] = message.text;
         FFI.setByName("chat_server_mode", jsonEncode(msg));
       }
     }
     notifyListeners();
-    scrollToBottom();
   }
 
   close() {
diff --git a/flutter/lib/pages/chat_page.dart b/flutter/lib/pages/chat_page.dart
index 527f2a8c6..ce139d062 100644
--- a/flutter/lib/pages/chat_page.dart
+++ b/flutter/lib/pages/chat_page.dart
@@ -1,4 +1,4 @@
-import 'package:dash_chat/dash_chat.dart';
+import 'package:dash_chat_2/dash_chat_2.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_hbb/common.dart';
 import 'package:flutter_hbb/models/chat_model.dart';
@@ -23,7 +23,7 @@ class ChatPage extends StatelessWidget implements PageShape {
             final id = entry.key;
             final user = entry.value.chatUser;
             return PopupMenuItem<int>(
-              child: Text("${user.name}   ${user.uid}"),
+              child: Text("${user.firstName}   ${user.id}"),
               value: id,
             );
           }).toList();
@@ -44,19 +44,24 @@ class ChatPage extends StatelessWidget implements PageShape {
               return Stack(
                 children: [
                   DashChat(
-                    inputContainerStyle: BoxDecoration(color: Colors.white70),
-                    sendOnEnter: false,
-                    // if true,reload keyboard everytime,need fix
                     onSend: (chatMsg) {
                       chatModel.send(chatMsg);
                     },
-                    user: chatModel.me,
+                    currentUser: chatModel.me,
                     messages:
                         chatModel.messages[chatModel.currentID]?.chatMessages ??
                             [],
-                    // default scrollToBottom has bug https://github.com/fayeed/dash_chat/issues/53
-                    scrollToBottom: false,
-                    scrollController: chatModel.scroller,
+                    messageOptions: MessageOptions(
+                        showOtherUsersAvatar: false,
+                        showTime: true,
+                        messageDecorationBuilder: (_, __, ___) =>
+                            defaultMessageDecoration(
+                              color: MyTheme.accent80,
+                              borderTopLeft: 8,
+                              borderTopRight: 8,
+                              borderBottomRight: 8,
+                              borderBottomLeft: 8,
+                            )),
                   ),
                   chatModel.currentID == ChatModel.clientModeID
                       ? SizedBox.shrink()
@@ -68,7 +73,7 @@ class ChatPage extends StatelessWidget implements PageShape {
                                   color: MyTheme.accent80),
                               SizedBox(width: 5),
                               Text(
-                                "${currentUser.name ?? ""}   ${currentUser.uid ?? ""}",
+                                "${currentUser.firstName}   ${currentUser.id}",
                                 style: TextStyle(color: MyTheme.accent50),
                               ),
                             ],
diff --git a/flutter/pubspec.lock b/flutter/pubspec.lock
index a1db4ba6c..ec709b959 100644
--- a/flutter/pubspec.lock
+++ b/flutter/pubspec.lock
@@ -29,6 +29,27 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "2.1.0"
+  cached_network_image:
+    dependency: transitive
+    description:
+      name: cached_network_image
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.2.1"
+  cached_network_image_platform_interface:
+    dependency: transitive
+    description:
+      name: cached_network_image_platform_interface
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
+  cached_network_image_web:
+    dependency: transitive
+    description:
+      name: cached_network_image_web
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.1"
   characters:
     dependency: transitive
     description:
@@ -71,6 +92,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "3.0.2"
+  csslib:
+    dependency: transitive
+    description:
+      name: csslib
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.17.2"
   cupertino_icons:
     dependency: "direct main"
     description:
@@ -78,13 +106,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.0.4"
-  dash_chat:
+  dash_chat_2:
     dependency: "direct main"
     description:
-      name: dash_chat
+      name: dash_chat_2
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.16"
+    version: "0.0.12"
   device_info:
     dependency: "direct main"
     description:
@@ -195,6 +223,13 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
+  flutter_blurhash:
+    dependency: transitive
+    description:
+      name: flutter_blurhash
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.7.0"
   flutter_breadcrumb:
     dependency: "direct main"
     description:
@@ -202,6 +237,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.0.1"
+  flutter_cache_manager:
+    dependency: transitive
+    description:
+      name: flutter_cache_manager
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.3.0"
   flutter_launcher_icons:
     dependency: "direct dev"
     description:
@@ -247,6 +289,13 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
+  html:
+    dependency: transitive
+    description:
+      name: html
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.15.0"
   http:
     dependency: "direct main"
     description:
@@ -345,6 +394,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.0.0"
+  octo_image:
+    dependency: transitive
+    description:
+      name: octo_image
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.2"
   package_info:
     dependency: "direct main"
     description:
@@ -449,16 +505,14 @@ packages:
       name: provider
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "5.0.0"
+    version: "6.0.3"
   qr_code_scanner:
     dependency: "direct main"
     description:
-      path: "."
-      ref: fix_break_changes_platform
-      resolved-ref: "0feca6f15042c279ff575c559a3430df917b623d"
-      url: "https://github.com/Heap-Hop/qr_code_scanner.git"
-    source: git
-    version: "0.7.0"
+      name: qr_code_scanner
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
   quiver:
     dependency: transitive
     description:
@@ -466,6 +520,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "3.1.0"
+  rxdart:
+    dependency: transitive
+    description:
+      name: rxdart
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.27.5"
   settings_ui:
     dependency: "direct main"
     description:
@@ -541,6 +602,20 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.8.2"
+  sqflite:
+    dependency: transitive
+    description:
+      name: sqflite
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.3"
+  sqflite_common:
+    dependency: transitive
+    description:
+      name: sqflite_common
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.2.1+1"
   stack_trace:
     dependency: transitive
     description:
@@ -562,6 +637,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.1.0"
+  synchronized:
+    dependency: transitive
+    description:
+      name: synchronized
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.0+2"
   term_glyph:
     dependency: transitive
     description:
@@ -583,13 +665,6 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.4.0"
-  transparent_image:
-    dependency: transitive
-    description:
-      name: transparent_image
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "2.0.0"
   tuple:
     dependency: "direct main"
     description:
@@ -674,6 +749,41 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "2.1.2"
+  video_player:
+    dependency: transitive
+    description:
+      name: video_player
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.4.5"
+  video_player_android:
+    dependency: transitive
+    description:
+      name: video_player_android
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.3.8"
+  video_player_avfoundation:
+    dependency: transitive
+    description:
+      name: video_player_avfoundation
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.3.5"
+  video_player_platform_interface:
+    dependency: transitive
+    description:
+      name: video_player_platform_interface
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "5.1.3"
+  video_player_web:
+    dependency: transitive
+    description:
+      name: video_player_web
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.12"
   wakelock:
     dependency: "direct main"
     description:
@@ -745,5 +855,5 @@ packages:
     source: hosted
     version: "0.1.0"
 sdks:
-  dart: ">=2.17.0-0 <3.0.0"
+  dart: ">=2.17.0 <3.0.0"
   flutter: ">=3.0.0"
diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml
index fc01b3c83..2ee7ec1ac 100644
--- a/flutter/pubspec.yaml
+++ b/flutter/pubspec.yaml
@@ -32,7 +32,7 @@ dependencies:
   ffi: ^1.1.2
   path_provider: ^2.0.2
   external_path: ^1.0.1
-  provider: ^5.0.0
+  provider: ^6.0.3
   tuple: ^2.0.0
   wakelock: ^0.5.2
   device_info: ^2.0.2 
@@ -41,15 +41,12 @@ dependencies:
   url_launcher: ^6.0.9
   shared_preferences: ^2.0.6
   toggle_switch: ^1.4.0
-  dash_chat: ^1.1.16
+  dash_chat_2: ^0.0.12
   draggable_float_widget: ^0.0.2
   settings_ui: ^2.0.2
   flutter_breadcrumb: ^1.0.1
   http: ^0.13.4
-  qr_code_scanner:
-    git:
-      url: https://github.com/Heap-Hop/qr_code_scanner.git
-      ref: fix_break_changes_platform
+  qr_code_scanner: ^1.0.0
   zxing2: ^0.1.0
   image_picker: ^0.8.5
   image: ^3.1.3