У меня есть список людей, у каждого из которых есть собственное подключение к сокету. Я использую ListBuilder
для создания списка виджетов для них, но я хочу, чтобы каждый из этих виджетов слушал, получило ли соединение сокета человека событие от сервера, и обновлял его соответствующим образом. Я перепробовал все, что мог найти в Интернете, и до сих пор не могу найти решение.
Это то, что я пробовал с одним из решений, опубликованных ниже
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:socket_io_client/socket_io_client.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<Person> sockets = [
Person(
name: 'Jon',
socket: io('http://localhost:3000', {
'transports': ['websocket'],
'autoConnect': false
}),
controller: StreamController<String>()),
Person(
name: 'Tim',
socket: io('http://localhost:3000', {
'transports': ['websocket'],
'autoConnect': false
}),
controller: StreamController<String>()),
Person(
name: 'Bob',
socket: io('http://localhost:3000', {
'transports': ['websocket'],
'autoConnect': false
}),
controller: StreamController<String>()),
];
// function to sink the data
void sinkToController(data, Person person) {
var message = '$data';
person.controller.sink.add(message);
}
void streamPerson(Person person) {
person.socket.connect();
person.socket.on('connect', (data) {
print('connected');
person.socket.on('serverMessage', (data) {
print('$data');
sinkToController(data, person);
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Socket test app"),
),
body: Container(
child: ListView.builder(
itemCount: 3,
itemBuilder: (context, index) {
streamPerson(sockets[index]);
return GestureDetector(
onTap: () => sockets[index].socket.emit('msg', 'this is me: ${sockets[index].name}'),
child: Container(
height: 300,
width: 350,
child: Column(
children: [
Text(sockets[index].name),
StreamBuilder<String>(
initialData: 'initial',
stream: sockets[index].controller.stream,
builder: (context, snapshot) {
return Text('${snapshot.data}');
},
)
],
),
),
);
})),
);
}
}
class Person {
String name;
Socket socket;
StreamController<String> controller;
Person({this.name, this.socket, this.controller});
}
Однако это не ' t работает, поэтому я надеялся, что существует способ динамически преобразовать socket.on ('event') в поток и использовать его в сгенерированном построителе потока.
Результат:
Заранее спасибо