我刚开始学习Dart和Flutter,为了开始,我想开发一个充当服务器的应用程序(我们从telnet
发送消息)。
所以目前,我有以下两个课程:
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => new _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
List<String> _messages = <String>[];
...
}
正如我所说,该应用程序将作为服务器运行。我希望每次服务器收到消息时都更新列表_messages
。
我想从另一个班级更新它,我们称之为Server
,我称之为HomeScreen.addMessage(String message)
,我也想保持_HomeScreenState
私密。
我已经搜索了很多时间来寻找解决方案,但没有找到适合我需求的任何东西。
你们能帮助我吗?
非常感谢提前!
答案 0 :(得分:4)
您可以让State
订阅Stream
条消息。
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());
}
注意:如果您希望即使用户访问其他屏幕也能保持List
类,也可以拥有Server
个消息。您仍然需要Stream
或其他通知回调才能让State
知道列表已更改。