在 Flutter 中更新数据
Updating data in Flutter
我刚开始学习 Dart 和 Flutter,首先,我想开发一个充当服务器的应用程序(我们从 telnet
向其发送消息)。
所以目前,我有以下两个 classes:
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => new _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
List<String> _messages = <String>[];
...
}
正如我所说,该应用程序将 运行 作为服务器。我想在服务器每次收到消息时更新列表 _messages
。
我想从另一个 class 更新它,我们称它为 Server
,我称之为 HomeScreen.addMessage(String message)
,我还想保留 _HomeScreenState
私人。
我花了很多时间寻找解决方案,但没有找到适合我需要的东西。
你们能帮帮我吗?
非常感谢!
您可以让 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
class 所有,即使用户访问其他屏幕也能保持消息不变。您仍然需要 Stream
或其他通知回调,让您的 State
知道列表已更改。
我刚开始学习 Dart 和 Flutter,首先,我想开发一个充当服务器的应用程序(我们从 telnet
向其发送消息)。
所以目前,我有以下两个 classes:
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => new _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
List<String> _messages = <String>[];
...
}
正如我所说,该应用程序将 运行 作为服务器。我想在服务器每次收到消息时更新列表 _messages
。
我想从另一个 class 更新它,我们称它为 Server
,我称之为 HomeScreen.addMessage(String message)
,我还想保留 _HomeScreenState
私人。
我花了很多时间寻找解决方案,但没有找到适合我需要的东西。
你们能帮帮我吗?
非常感谢!
您可以让 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
class 所有,即使用户访问其他屏幕也能保持消息不变。您仍然需要 Stream
或其他通知回调,让您的 State
知道列表已更改。