2017-06-27 7 views
0

ダーツとフラッターの学習を始めたばかりです。開始するには、サーバーとして機能するアプリケーションを開発したいと思います(telnetからメッセージを送信します)。 フラッターでデータを更新する

だから現時点では、私は2つの以下のクラスを持っている:私が言ったように

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

 

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

    ... 
} 

ので、アプリはサーバとして動作します。サーバーがメッセージを受信するたびにリスト_messagesを更新したいと思います。

私は、すなわちHomeScreen.addMessage(String message)を呼び出し、私も_HomeScreenStateプライベートを維持したいと考えているから、のはServerそれを呼びましょう、別のクラスから、それを更新したいと思います。

解決策を探すのに多くの時間を費やしましたが、私のニーズに適したものは見つかりませんでした。

あなたは私を助けてくれますか?

事前に感謝します。

答えて

2

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を所有することができます。 Stateにリストが変更されたことを知らせるには、Streamまたはその他の通知コールバックが必要です。

+0

素晴らしい作品です!どうもありがとう – Dayrona

関連する問題