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