Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 颤振中的数据更新_Dart_Flutter - Fatal编程技术网

Dart 颤振中的数据更新

Dart 颤振中的数据更新,dart,flutter,Dart,Flutter,我刚开始学习Dart和Flatter,首先,我想开发一个充当服务器的应用程序(我们从telnet向其发送消息) 因此,目前,我有以下两个课程: class HomeScreen extends StatefulWidget { @override _HomeScreenState createState() => new _HomeScreenState(); } class\u homescrenstate扩展状态{ 列表_消息=[]; ... } 正如我所说,该应

我刚开始学习Dart和Flatter,首先,我想开发一个充当服务器的应用程序(我们从
telnet
向其发送消息)

因此,目前,我有以下两个课程:

class HomeScreen extends StatefulWidget {
    @override
    _HomeScreenState createState() => new _HomeScreenState();
}

class\u homescrenstate扩展状态{
列表_消息=[];
...
}
正如我所说,该应用程序将作为服务器运行。每次服务器收到消息时,我都要更新列表
\u messages

我想从另一个类中更新它,让我们称之为
服务器
,我从中调用,即
主屏幕.addMessage(字符串消息)
,我还想保持
\u HomeScreenState
私有

我花了很多时间寻找解决方案,但没有找到任何适合我需要的

你们能帮帮我吗


非常感谢

您可以让您的
状态
订阅
消息流

导入'dart:async';
进口“包装:颤振/材料.省道”;
类服务器{
StreamController _controller=新的StreamController.broadcast();
无效模拟消息(字符串消息){
_添加(消息);
}
Stream get messages=>\u controller.Stream;
}
最终服务器=新服务器();
类主屏幕扩展StatefulWidget{
@凌驾
_HomeScreenState createState()=>新的_HomeScreenState();
}
类_homescrenstate扩展状态{
列表_消息=[];
流动认购(流动认购);;
@凌驾
void initState(){
_订阅=server.messages.listen((字符串消息){
设置状态(){
_消息。添加(消息);
});
});
super.initState();
}
@凌驾
无效处置(){
_订阅。取消();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
TextStyle TextStyle=Theme.of(context).textTheme.display2;
归还新脚手架(
appBar:新的appBar(
标题:新文本(“Telnet示例”),
),
正文:新列表视图(
子项:_messages.map((字符串消息){
归还新卡(
子容器:新容器(
高度:100.0,
孩子:新中心(
子项:新文本(消息,样式:textStyle),
),
),
);
}).toList(),
),
floatingActionButton:新的floatingActionButton(
子:新图标(Icons.add),
已按下:(){
//模拟消息到达
server.simulateMessage('Hello Dayrona!');
},
),
);
}
}
类TelnetSample扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主题:新主题数据.dark(),
主页:新的主屏幕(),
);
}
}
void main(){
runApp(新的TelnetSample());
}

注意:如果希望在用户访问其他屏幕时保持消息列表,则可以将消息列表归
服务器
类所有。您仍然需要一个
或其他通知回调来让您的
状态
知道列表已更改。

您可以让您的
状态
订阅一个

导入'dart:async';
进口“包装:颤振/材料.省道”;
类服务器{
StreamController _controller=新的StreamController.broadcast();
无效模拟消息(字符串消息){
_添加(消息);
}
Stream get messages=>\u controller.Stream;
}
最终服务器=新服务器();
类主屏幕扩展StatefulWidget{
@凌驾
_HomeScreenState createState()=>新的_HomeScreenState();
}
类_homescrenstate扩展状态{
列表_消息=[];
流动认购(流动认购);;
@凌驾
void initState(){
_订阅=server.messages.listen((字符串消息){
设置状态(){
_消息。添加(消息);
});
});
super.initState();
}
@凌驾
无效处置(){
_订阅。取消();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
TextStyle TextStyle=Theme.of(context).textTheme.display2;
归还新脚手架(
appBar:新的appBar(
标题:新文本(“Telnet示例”),
),
正文:新列表视图(
子项:_messages.map((字符串消息){
归还新卡(
子容器:新容器(
高度:100.0,
孩子:新中心(
子项:新文本(消息,样式:textStyle),
),
),
);
}).toList(),
),
floatingActionButton:新的floatingActionButton(
子:新图标(Icons.add),
已按下:(){
//模拟消息到达
server.simulateMessage('Hello Dayrona!');
},
),
);
}
}
类TelnetSample扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主题:新主题数据.dark(),
主页:新的主屏幕(),
);
}
}
void main(){
runApp(新的TelnetSample());
}
注意:如果希望在用户访问其他屏幕时保持消息列表,则可以将消息列表归
服务器
类所有。您仍然需要一个
或其他通知回调来让您的
状态
知道列表已更改

 class _HomeScreenState extends State<HomeScreen> {
    List<String> _messages = <String>[];

    ...
}
import 'dart:async';
import 'package:flutter/material.dart';

class Server {
  StreamController<String> _controller = new StreamController.broadcast();
  void simulateMessage(String message) {
    _controller.add(message);
  }
  Stream get messages => _controller.stream;
}

final server = new Server();

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => new _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  List<String> _messages = <String>[];
  StreamSubscription<String> _subscription;

  @override
  void initState() {
    _subscription = server.messages.listen((String message) {
      setState(() {
        _messages.add(message);
      });
    });
    super.initState();
  }

  @override
  void dispose() {
    _subscription.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    TextStyle textStyle = Theme.of(context).textTheme.display2;
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Telnet Example'),
      ),
      body: new ListView(
        children: _messages.map((String message) {
          return new Card(
            child: new Container(
              height: 100.0,
              child: new Center(
                child: new Text(message, style: textStyle),
              ),
            ),
          );
        }).toList(),
      ),
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.add),
        onPressed: () {
          // simulate a message arriving
          server.simulateMessage('Hello Dayrona!');
        },
      ),
    );
  }
}

class TelnetSample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      theme: new ThemeData.dark(),
      home: new HomeScreen(),
    );
  }
}

void main() {
  runApp(new TelnetSample());
}