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