首页 文章

在Flutter中更新数据

提问于
浏览
0

我刚开始学习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 回答

  • 3

    您可以让 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());
    }
    

    注意:如果您希望即使用户访问其他屏幕也能保持 Server 类,也可以拥有 List 消息 . 您仍然需要 Stream 或其他通知回调才能让 State 知道列表已更改 .

相关问题