【问题标题】:Updating data in Flutter在 Flutter 中更新数据
【发布时间】:2017-11-30 23:28:33
【问题描述】:

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

我花了很多时间寻找解决方案,但没有找到适合我需要的解决方案。

你们能帮帮我吗?

非常感谢!

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

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

    注意:如果您想让消息的ListServer 类所有,即使用户访问其他屏幕也可以使其保持不变。您仍然需要Stream 或其他通知回调来让您的State 知道列表已更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-07
      • 2019-08-19
      • 2020-02-25
      • 2019-06-19
      • 2019-09-26
      • 2022-10-13
      • 2021-02-03
      • 2022-11-17
      相关资源
      最近更新 更多