background_socket_connect 0.0.1 copy "background_socket_connect: ^0.0.1" to clipboard
background_socket_connect: ^0.0.1 copied to clipboard

Flutter plugin for background WebSocket connection with Android foreground service support.

example/lib/main.dart

import 'package:background_socket_connect/background_socket_connect_platform_interface.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final BackgroundSocketConnectPlatform _socket = BackgroundSocketConnectPlatform.instance;
  final TextEditingController _messageController = TextEditingController();
  List<String> messages = [];
  bool isConnected = false;

  @override
  void initState() {
    super.initState();
    _setupSocketCallbacks();
  }

  void _setupSocketCallbacks() {
    _socket.setOnConnectedCallback(() {
      setState(() {
        isConnected = true;
        messages.add('✅ Connected to server');
      });
    });

    _socket.setOnMessageCallback((message) {
      print('📨 Received: $message');
      setState(() {
        messages.add('📨 Received: $message');
      });
    });

    _socket.setOnDisconnectedCallback((code, reason) {
      print('❌ Disconnected: $reason (code: $code)');
      setState(() {
        isConnected = false;
        messages.add('❌ Disconnected: $reason (code: $code)');
      });
    });

    _socket.setOnErrorCallback((error) {
      print('⚠️ Error: $error');
      setState(() {
        messages.add('⚠️ Error: $error');
      });
    });
  }

  Future<void> _connect() async {
    try {
      await _socket.connect(
        url: 'wss://your-server.com/ws',
        headers: {
          'User-Agent': 'FlutterSocketClient/1.0',
        },
        // Required for ws:// connections
      );
      setState(() {
        messages.add('🔄 Connecting to socket...');
      });
    } catch (e) {
      print('❌ Connection failed: $e');
      setState(() {
        messages.add('❌ Connection failed: $e');
      });
    }
  }

  Future<void> _disconnect() async {
    try {
      await _socket.disconnect();
      setState(() {
        isConnected = false;
        messages.add('🛑 Disconnected manually');
      });
    } catch (e) {
      setState(() {
        messages.add('❌ Disconnect failed: $e');
      });
    }
  }

  Future<void> _sendMessage() async {
    if (_messageController.text.isEmpty) return;

    try {
      await _socket.sendMessage(_messageController.text);
      setState(() {
        messages.add('📤 Sent: ${_messageController.text}');
        _messageController.clear();
      });
    } catch (e) {
      setState(() {
        messages.add('❌ Send failed: $e');
      });
    }
  }

  Future<void> _startBackgroundService() async {
    try {
      await _socket.startBackgroundService();
      setState(() {
        messages.add('🔄 Background service started');
      });
    } catch (e) {
      setState(() {
        messages.add('❌ Failed to start background service: $e');
      });
    }
  }

  Future<void> _stopBackgroundService() async {
    try {
      await _socket.stopBackgroundService();
      setState(() {
        messages.add('🛑 Background service stopped');
      });
    } catch (e) {
      setState(() {
        messages.add('❌ Failed to stop background service: $e');
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Socket Connection Demo'),
          backgroundColor: Colors.blue,
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: [
              // Connection Status
              Container(
                padding: EdgeInsets.all(12),
                decoration: BoxDecoration(
                  color: isConnected ? Colors.green[50] : Colors.red[50],
                  border: Border.all(
                    color: isConnected ? Colors.green : Colors.red,
                  ),
                  borderRadius: BorderRadius.circular(8),
                ),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Icon(
                      isConnected ? Icons.wifi : Icons.wifi_off,
                      color: isConnected ? Colors.green : Colors.red,
                    ),
                    SizedBox(width: 8),
                    Text(
                      isConnected ? 'Connected' : 'Disconnected',
                      style: TextStyle(
                        fontWeight: FontWeight.bold,
                        color: isConnected ? Colors.green : Colors.red,
                      ),
                    ),
                  ],
                ),
              ),

              SizedBox(height: 20),

              // Connection Buttons
              Row(
                children: [
                  Expanded(
                    child: ElevatedButton.icon(
                      onPressed: isConnected ? null : _connect,
                      icon: Icon(Icons.link),
                      label: Text('Connect'),
                      style: ElevatedButton.styleFrom(
                        backgroundColor: Colors.green,
                        foregroundColor: Colors.white,
                      ),
                    ),
                  ),
                  SizedBox(width: 10),
                  Expanded(
                    child: ElevatedButton.icon(
                      onPressed: isConnected ? _disconnect : null,
                      icon: Icon(Icons.link_off),
                      label: Text('Disconnect'),
                      style: ElevatedButton.styleFrom(
                        backgroundColor: Colors.red,
                        foregroundColor: Colors.white,
                      ),
                    ),
                  ),
                ],
              ),

              SizedBox(height: 10),

              // Background Service Buttons
              Row(
                children: [
                  Expanded(
                    child: OutlinedButton.icon(
                      onPressed: _startBackgroundService,
                      icon: Icon(Icons.play_arrow),
                      label: Text('Start Background'),
                    ),
                  ),
                  SizedBox(width: 10),
                  Expanded(
                    child: OutlinedButton.icon(
                      onPressed: _stopBackgroundService,
                      icon: Icon(Icons.stop),
                      label: Text('Stop Background'),
                    ),
                  ),
                ],
              ),

              SizedBox(height: 20),

              // Message Input
              TextField(
                controller: _messageController,
                decoration: InputDecoration(
                  labelText: 'Message to send',
                  border: OutlineInputBorder(),
                  suffixIcon: IconButton(
                    icon: Icon(Icons.send),
                    onPressed: isConnected ? _sendMessage : null,
                  ),
                ),
                onSubmitted: isConnected ? (_) => _sendMessage() : null,
              ),

              SizedBox(height: 10),

              ElevatedButton(
                onPressed: isConnected ? _sendMessage : null,
                child: Text('Send Message'),
                style: ElevatedButton.styleFrom(
                  minimumSize: Size(double.infinity, 50),
                ),
              ),

              SizedBox(height: 20),

              // Messages Header
              Row(
                children: [
                  Text(
                    'Messages:',
                    style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
                  ),
                  Spacer(),
                  TextButton(
                    onPressed: () {
                      setState(() {
                        messages.clear();
                      });
                    },
                    child: Text('Clear'),
                  ),
                ],
              ),

              SizedBox(height: 10),

              // Messages List
              Expanded(
                child: Container(
                  decoration: BoxDecoration(
                    border: Border.all(color: Colors.grey[300]!),
                    borderRadius: BorderRadius.circular(8),
                  ),
                  child: messages.isEmpty
                      ? Center(
                    child: Text(
                      'No messages yet',
                      style: TextStyle(color: Colors.grey),
                    ),
                  )
                      : ListView.builder(
                    itemCount: messages.length,
                    itemBuilder: (context, index) {
                      return Container(
                        padding: EdgeInsets.all(12),
                        decoration: BoxDecoration(
                          border: index > 0
                              ? Border(
                            top: BorderSide(color: Colors.grey[300]!),
                          )
                              : null,
                        ),
                        child: Text(
                          messages[index],
                          style: TextStyle(fontSize: 14),
                        ),
                      );
                    },
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _socket.disconnect();
    _messageController.dispose();
    super.dispose();
  }
}
7
likes
130
points
97
downloads

Publisher

unverified uploader

Weekly Downloads

Flutter plugin for background WebSocket connection with Android foreground service support.

Documentation

API reference

License

MIT (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on background_socket_connect

Packages that implement background_socket_connect