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