在Flutter中更新数据

时间:2017-06-27 19:22:19

标签: dart flutter

我刚开始学习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私密。

我已经搜索了很多时间来寻找解决方案,但没有找到适合我需求的任何东西。

你们能帮助我吗?

非常感谢提前!

1 个答案:

答案 0 :(得分:4)

您可以让State订阅Stream条消息。

screenshot

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知道列表已更改。