rule-based offline chatbot

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



Leave a Reply