Machine Learning integration for Flutter using TensorFlow Lite and Firebase ML
日本語の概要は準備中です。原文の説明を表示しています。
WebSocket and Socket.io integration for real-time communication in Flutter
インストールする前に、エージェントに与えられる指示の中身を確認できます。
This skill enables real-time bidirectional communication between Flutter apps and servers using WebSocket or Socket.io protocols. Perfect for chat applications, live updates, notifications, and collaborative features.
dependencies:
web_socket_channel: ^2.4.0
socket_io_client: ^2.0.3
connectivity_plus: ^5.0.2
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:web_socket_channel/io.dart';
class WebSocketService {
WebSocketChannel? _channel;
final String url;
final Function(dynamic)? onMessage;
final Function()? onConnect;
final Function(dynamic)? onError;
final Function(int?)? onClose;
WebSocketService({
required this.url,
this.onMessage,
this.onConnect,
this.onError,
this.onClose,
});
void connect() {
try {
_channel = IOWebSocketChannel.connect(url);
_channel!.stream.listen(
(message) {
onMessage?.call(message);
},
onDone: () {
onClose?.call(_channel?.closeCode);
},
onError: (error) {
onError?.call(error);
},
);
onConnect?.call();
} catch (e) {
onError?.call(e);
}
}
void send(dynamic message) {
_channel?.sink.add(message);
}
void disconnect() {
_channel?.sink.close();
_channel = null;
}
}
import 'package:flutter_riverpod/flutter_riverpod.dart';
class WebSocketState {
final bool isConnected;
final List<String> messages;
final String? error;
WebSocketState({
this.isConnected = false,
this.messages = const [],
this.error,
});
WebSocketState copyWith({
bool? isConnected,
List<String>? messages,
String? error,
}) {
return WebSocketState(
isConnected: isConnected ?? this.isConnected,
messages: messages ?? this.messages,
error: error,
);
}
}
class WebSocketNotifier extends StateNotifier<WebSocketState> {
late final WebSocketService _service;
WebSocketNotifier() : super(WebSocketState()) {
_service = WebSocketService(
url: 'wss://your-server.com/ws',
onMessage: _handleMessage,
onConnect: () => state = state.copyWith(isConnected: true),
onClose: (_) => state = state.copyWith(isConnected: false),
onError: (error) => state = state.copyWith(error: error.toString()),
);
}
void connect() => _service.connect();
void disconnect() => _service.disconnect();
void send(String message) => _service.send(message);
void _handleMessage(dynamic message) {
final messages = [...state.messages, message.toString()];
state = state.copyWith(messages: messages);
}
}
final webSocketProvider = StateNotifierProvider<WebSocketNotifier, WebSocketState>(
(ref) => WebSocketNotifier(),
);
import 'package:socket_io_client/socket_io_client.dart' as io;
class SocketIOService {
io.Socket? _socket;
final String url;
SocketIOService({required this.url});
void connect() {
_socket = io.io(url, <String, dynamic>{
'transports': ['websocket'],
'autoConnect': true,
});
_socket!.onConnect((_) {
print('Connected to Socket.io');
});
_socket!.onDisconnect((_) {
print('Disconnected from Socket.io');
});
_socket!.on('message', (data) {
print('Received: $data');
});
}
void emit(String event, dynamic data) {
_socket?.emit(event, data);
}
void on(String event, Function(dynamic) handler) {
_socket?.on(event, handler);
}
void disconnect() {
_socket?.disconnect();
}
}
class ReconnectingWebSocket {
final String url;
final Duration initialDelay;
final Duration maxDelay;
final int maxAttempts;
int _attempts = 0;
Timer? _reconnectTimer;
void _scheduleReconnect() {
if (_attempts >= maxAttempts) return;
final delay = Duration(
milliseconds: min(
initialDelay.inMilliseconds * pow(2, _attempts),
maxDelay.inMilliseconds,
),
);
_reconnectTimer = Timer(delay, () {
_attempts++;
connect();
});
}
}
class WebSocketMessageQueue {
final List<String> _queue = [];
void enqueue(String message) {
_queue.add(message);
}
void flush(WebSocketService service) {
while (_queue.isNotEmpty) {
final message = _queue.removeAt(0);
service.send(message);
}
}
}
class ChatPage extends ConsumerWidget {
const ChatPage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final wsState = ref.watch(webSocketProvider);
final wsNotifier = ref.read(webSocketProvider.notifier);
final messageController = TextEditingController();
return Scaffold(
appBar: AppBar(
title: Text('Chat ${wsState.isConnected ? "(Online)" : "(Offline)"}'),
),
body: Column(
children: [
Expanded(
child: ListView.builder(
itemCount: wsState.messages.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(wsState.messages[index]),
);
},
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Expanded(
child: TextField(
controller: messageController,
decoration: const InputDecoration(
hintText: 'Type a message...',
),
),
),
IconButton(
icon: const Icon(Icons.send),
onPressed: () {
if (messageController.text.isNotEmpty) {
wsNotifier.send(messageController.text);
messageController.clear();
}
},
),
],
),
),
],
),
);
}
}
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
class MockWebSocketChannel extends Mock implements WebSocketChannel {}
void main() {
test('WebSocket connection test', () async {
final service = WebSocketService(url: 'ws://test.com');
bool connected = false;
service.onConnect = () => connected = true;
service.connect();
expect(connected, true);
});
}
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Machine Learning integration for Flutter using TensorFlow Lite and Firebase ML
日本語の概要は準備中です。原文の説明を表示しています。
Google Maps and Mapbox integration for Flutter applications
日本語の概要は準備中です。原文の説明を表示しています。
Implement tasks from an OpenSpec change. Use when the user wants to start implementing, continue implementation, or work through tasks.
日本語の概要は準備中です。原文の説明を表示しています。
Archive a completed change in the experimental workflow. Use when the user wants to finalize and archive a change after implementation is complete.
日本語の概要は準備中です。原文の説明を表示しています。
Enter explore mode - a thinking partner for exploring ideas, investigating problems, and clarifying requirements. Use when the user wants to think through something before or during a change.
日本語の概要は準備中です。原文の説明を表示しています。
Propose a new change with all artifacts generated in one step. Use when the user wants to quickly describe what they want to build and get a complete proposal with design, specs, and tasks ready for implementation.
日本語の概要は準備中です。原文の説明を表示しています。