chat_context_menu 1.3.0
chat_context_menu: ^1.3.0 copied to clipboard
A Flutter package that provides chat context menu with customizable appearance and animations, perfect for chat applications.
import 'package:chat_context_menu/chat_context_menu.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Chat Context Menu Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
),
home: const ChatScreen(),
);
}
}
class ChatScreen extends StatefulWidget {
const ChatScreen({super.key});
@override
State<ChatScreen> createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
final List<String> _messages = [
"Hello!",
"Hello!",
"Hello!",
"How are you?",
"How are you?",
"How are you?",
"This is a long press context menu demo.",
"Try long pressing on any message.",
"Try long pressing on any message.",
"You can see different options.",
"You can see different options.",
"Like Reply, Copy, Forward, Delete.",
"It mimics the iOS style context menu.",
"Hope",
"It mimics the iOS style context menu.",
"Hope",
"Like Reply, Copy, Forward, Delete.",
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Chat Context Menu'),
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
),
backgroundColor: Colors.white,
body: Column(
children: [
Expanded(
child: ListView.builder(
padding: const EdgeInsets.all(16),
itemCount: _messages.length,
itemBuilder: (context, index) {
final isMe = index % 2 == 0;
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
child: Align(
alignment: isMe
? Alignment.centerRight
: Alignment.centerLeft,
child: ChatContextMenuWrapper(
barrierColor: Colors.transparent,
backgroundColor: Colors.white,
borderRadius: BorderRadius.circular(10),
shadows: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.2),
blurRadius: 32,
),
],
// Fix 1: Prevent focus loss
requestFocus: false,
// Fix 2: Avoid overlapping AppBar and BottomNavigationBar
menuBuilder: (context, hideMenu) {
return Container(
width: 300,
height: 56,
alignment: .center,
child: ElevatedButton(
onPressed: hideMenu,
child: const Text('Close'),
),
);
},
widgetBuilder: (context, showMenu) {
return GestureDetector(
onLongPress: showMenu,
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 10,
),
decoration: BoxDecoration(
color: isMe
? Colors.blue.shade100
: Colors.grey.shade200,
borderRadius: BorderRadius.circular(16),
),
child: Text(
_messages[index],
style: const TextStyle(fontSize: 16),
),
),
);
},
),
),
);
},
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
decoration: const InputDecoration(
hintText: 'Type a message...',
border: OutlineInputBorder(),
),
),
),
],
),
bottomNavigationBar: BottomNavigationBar(
items: const [
BottomNavigationBarItem(icon: Icon(Icons.chat), label: 'Chat'),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
label: 'Settings',
),
],
),
);
}
}