Flutter - поток уже прослушан с использованием сокетов - PullRequest
0 голосов
/ 22 октября 2019

Я в некотором роде потерян, я получил данные моего Esp8266 с помощью функции Streambuilder(), проблема в том, что каждый раз, когда я меняю экран и возвращаюсь к экрану, я получаю ошибку: Поток уже прослушанна

Я читал, что я должен использовать Streamcontroller в трансляции. Но я не могу понять, как добавить или прослушать изменения моего сокета.

Теперь результат в том, что в моем Text виджете ничего не написано.

Вот мой код (упрощенная версия только с одной страницей)

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'dart:io';
import 'dart:async';

void main() async{
  Socket sock = await Socket.connect('192.168.1.24', 80);
runApp(MyApp(sock));
}

class MyApp extends StatelessWidget {
  Socket socket;

  MyApp(Socket s){
    this.socket = s;
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(

        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page',
        channel : socket,
      ),

    );
  }
}

class MyHomePage extends StatefulWidget {
  final Socket channel;
  MyHomePage({Key key, this.title, this.channel}) : super(key: key);



  final String title;



  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  TextEditingController _controller = TextEditingController();

  StreamController streamController = new StreamController.broadcast();   
//I have my controller here, but I need it to listen to my widget.channel




  void _togglePower(){
    widget.channel.write("Apero\n");

  }
  /*
  @override
  void dispose(){
    widget.channel.close(); //Faire un flush avant de close.
    super.dispose();
  }*/

  @override
  void dispose(){
    streamController.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {


    return Scaffold(
      appBar: AppBar(

        title: Text(widget.title),
      ),
      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              child: Text("Testou",
              style: TextStyle(
                color: Colors.amber,
                fontStyle: FontStyle.italic,
                fontSize: 20
              )
            ),
        color: Colors.black,
              onPressed: _togglePower,
            ),


            Form(
              child: TextFormField(
                controller: _controller,
                decoration: InputDecoration(labelText: 'Send a message'),
              ),
            ),
            StreamBuilder(
              stream: streamController.stream,
              builder: (context, snapshot) {
                return Padding(
                  padding: const EdgeInsets.symmetric(vertical: 24.0),
                  child: Text(snapshot.hasData
                      ? '${String.fromCharCodes(snapshot.data)}'
                      : 'loading'),
                );
              },
            )
          ],
        ),
      ),

    );
  }

}

Или, может быть, есть способ сделать это проще, используя widget.channel.listen?

Спасибо за любую помощь! Хорошего вечера:)

...