2017-06-27 16 views
0

Ich habe gerade angefangen, Dart and Flutter zu lernen und zum Starten möchte ich eine Anwendung entwickeln, die als Server fungiert (zu dem wir Nachrichten von telnet senden).Aktualisieren von Daten in Flutter

Also im Moment, ich habe die beiden folgenden Klassen:

class HomeScreen extends StatefulWidget { 
    @override 
    _HomeScreenState createState() => new _HomeScreenState(); 
} 

 

class _HomeScreenState extends State<HomeScreen> { 
    List<String> _messages = <String>[]; 

    ... 
} 

Also wie gesagt, die App als Server ausgeführt wird. Ich möchte die Liste _messages jedes Mal aktualisieren, wenn der Server eine Nachricht empfängt.

Ich möchte es von einer anderen Klasse aktualisieren, nennen wir es Server, aus dem ich z. B. HomeScreen.addMessage(String message) anrufen und ich würde auch gerne _HomeScreenState privat halten.

Ich habe viel Zeit für eine Lösung gesucht, aber nichts für meine Bedürfnisse gefunden.

Könnt ihr mir helfen?

Vielen Dank im Voraus!

Antwort

2

Sie können Ihre State abonnieren Sie eine Stream von Nachrichten.

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()); 
} 

Hinweis: Sie können die List von Nachrichten müssen von der Server Klasse gehört werden, wenn Sie es auch dann, wenn der Benutzer besucht andere Bildschirme machen wollen bestehen bleiben. Sie benötigen immer noch einen Stream oder einen anderen Benachrichtigungs-Callback, damit Ihre State die Liste ändern kann.

+0

Funktioniert wunderbar! Danke vielmals – Dayrona