флаттер websocket streambuilder данные повторно получены? - PullRequest
0 голосов
/ 05 октября 2018

Как обновить 2-3-страничный пользовательский интерфейс с помощью веб-сокета.

@override
  Widget build(BuildContext context) {
    return new StreamBuilder(
      stream: globalWsStream,
      builder: (context, snapshot) {
        // from snapshot we can get new data
        // add to globalData and start animation
        if (snapshot.hasData) {
          print('---why this called many times when state changed.');
          _solveReceivedMessage(snapshot.data);
        } else {
          print('Chat 被锁住了不会进行任何操作');
        }
        return new CupertinoPageScaffold(
          key: _scaffoldKey,
          navigationBar: CupertinoNavigationBar(
            previousPageTitle: '聊天',
            // padding: new EdgeInsetsDirectional.only(top:8.0, bottom: 9.0),
            // leading: new Text('聊天'),
            actionsForegroundColor: GlobalConfig.cupertinoMainColor,
            middle: new Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                new Text('${widget.sess.targetName}', style: new TextStyle(fontWeight: FontWeight.bold),),
                new Text('对话中', style: new TextStyle(fontSize: 12.0, fontWeight: FontWeight.w200),)
              ]
            ),
            trailing: CupertinoButton(
              padding: new EdgeInsets.all(5.0),
              child: Icon(
                CupertinoIcons.ellipsis,
                color: GlobalConfig.cupertinoMainColor,
                // size: 10.0,
                semanticLabel: 'Add',
              ),
              onPressed: () {
                Navigator.of(context).push(new CupertinoPageRoute(builder: (c) {
                  return new UserChatSettings();
                }));
              },
            ),
          ),
          child: new GestureDetector(
              onTap: () {
                print("点击了");
                _hideKeyboard('');
              },
              child: new Stack(
                children: <Widget>[
                  new Container(
                    padding: new EdgeInsets.all(0.0),
                    child: globalAppSettings.isBlurBk
                        ? new BackdropFilter(
                            filter:
                                new ImageFilter.blur(sigmaX: 5.0, sigmaY: 5.0),
                            child: new Container(
                              decoration: new BoxDecoration(
                                  color: Colors.white.withOpacity(0.0)),
                            ),
                          )
                        : null,
                    decoration: new BoxDecoration(
                        image: new DecorationImage(
                            // image: _getBkImage(),
                            image: !_hasCustomBk
                                // ? new AssetImage("assets/images/chat_bk_5.jpg")
                                ? new AssetImage('assets/images/chat_bk_6.jpg')
                                : new FileImage(_chatBkFile),
                            fit: BoxFit.cover)),
                  ),
                  new Container(
                    padding: new EdgeInsets.all(0.0),
                    child: new Container(child: _buildMsgList()),
                  ),
                  new Column(
                    mainAxisAlignment: MainAxisAlignment.end,
                    children: <Widget>[
                      new Container(
                          // color: Colors.white,
                          padding: new EdgeInsets.only(
                              top: 15.0, bottom: 15.0, left: 5.0, right: 5.0),
                          child: _buildComposer2())
                    ],
                  ),
                ],
              )),
        );
      },
    );
  }

Этот StreamBbuilder не работает, когда я касаюсь экрана или набираю что-то, одни и те же данные будут повторяться.

поток - это просто веб-сокет, который подключается к каналу веб-сокета, поступают новые данные, построитель потока получит эти данные правильно, но вопрос в том, когда я делаю какие-либо действия, такие как всплывающий программный метод,те же данные будут получены повторить.Как мне это решить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...