offline + rule-based, which means:
- No internet required
- You can design your own chatbot brain by adding questions & answers
Rule-Based Offline Chatbot (Advanced)
Update your main.dart
with this:
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(
debugShowCheckedModeBanner: false,
title: 'Rule-based Chatbot',
theme: ThemeData(primarySwatch: Colors.blue),
home: ChatScreen(),
);
}
}
class ChatScreen extends StatefulWidget {
@override
State<ChatScreen> createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
final List<Map<String, String>> _messages = [];
final TextEditingController _controller = TextEditingController();
/// Predefined rules for chatbot
final Map<String, String> _botResponses = {
"hello": "Hi there! How can I help you?",
"hi": "Hello! How are you today?",
"how are you": "I’m just a bot, but I’m doing great! ",
"bye": "Goodbye! Have a nice day!",
"your name": "I’m FlutterBot , built with Flutter!",
"what is flutter": "Flutter is Google’s UI toolkit for building apps.",
"thanks": "You're welcome! ",
};
void _sendMessage() {
if (_controller.text.trim().isEmpty) return;
String userMessage = _controller.text.trim();
setState(() {
_messages.add({"sender": "user", "text": userMessage});
});
_controller.clear();
_botReply(userMessage);
}
void _botReply(String userMessage) {
String reply = "Sorry, I don’t understand that yet. ";
for (var key in _botResponses.keys) {
if (userMessage.toLowerCase().contains(key)) {
reply = _botResponses[key]!;
break;
}
}
Future.delayed(const Duration(milliseconds: 600), () {
setState(() {
_messages.add({"sender": "bot", "text": reply});
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("FlutterBot ")),
body: Column(
children: [
// Chat history
Expanded(
child: ListView.builder(
reverse: true,
itemCount: _messages.length,
itemBuilder: (context, index) {
final msg = _messages[_messages.length - 1 - index];
bool isUser = msg["sender"] == "user";
return Align(
alignment: isUser ? Alignment.centerRight : Alignment.centerLeft,
child: Container(
margin: const EdgeInsets.all(8),
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: isUser ? Colors.blueAccent : Colors.grey[300],
borderRadius: BorderRadius.circular(10),
),
child: Text(
msg["text"]!,
style: TextStyle(
color: isUser ? Colors.white : Colors.black,
fontSize: 16,
),
),
),
);
},
),
),
// Input field
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
color: Colors.grey[200],
child: Row(
children: [
Expanded(
child: TextField(
controller: _controller,
decoration: const InputDecoration(
hintText: "Type a message...",
border: InputBorder.none,
),
onSubmitted: (_) => _sendMessage(),
),
),
IconButton(
icon: const Icon(Icons.send, color: Colors.blue),
onPressed: _sendMessage,
)
],
),
)
],
),
);
}
}
Features
- Predefined Q/A responses (hello, bye, your name, what is flutter, etc.)
- Case-insensitive matching (works with
Hello
,HELLO
, etc.) - Friendly default response if question not found