dart的sream流方式实现flutter windows子窗口交互例程

该代码演示了如何在Flutter中使用 Stream 和 StreamController 来实现组件之间的通信。通过两个窗口的交互,用户可以看到消息传递和状态更新的实时效果。

import 'dart:async';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final StreamController<String> _streamControllerWindow1 =
      StreamController<String>();
  final StreamController<String> _streamControllerWindow2 =
      StreamController<String>();

  
  void dispose() {
    _streamControllerWindow1.close();
    _streamControllerWindow2.close();
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      body: Row(
        children: <Widget>[
          Window1(
              streamController: _streamControllerWindow1,
              incomingStream: _streamControllerWindow2.stream),
          Window2(
              streamController: _streamControllerWindow2,
              incomingStream: _streamControllerWindow1.stream),
        ],
      ),
    );
  }
}

class Window1 extends StatefulWidget {
  final StreamController<String> streamController;
  final Stream<String> incomingStream;

  Window1({required this.streamController, required this.incomingStream});

  
  _Window1State createState() => _Window1State();
}

class _Window1State extends State<Window1> {
  int _counter = 0;
  String _receivedText = '';

  
  void initState() {
    super.initState();
    widget.incomingStream.listen((data) {
      setState(() {
        _receivedText = data;
      });
    });
  }

  
  Widget build(BuildContext context) {
    String messageToSend = 'Counter: $_counter';

    return Expanded(
      child: Container(
        decoration: BoxDecoration(
          border: Border.all(color: Colors.blue, width: 2.0),
          color: Colors.blue[100],
        ),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Received from Window 2:',
              style: TextStyle(fontSize: 18.0),
            ),
            SizedBox(height: 10.0),
            Text(
              _receivedText,
              style: TextStyle(fontSize: 24.0, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 20.0),
            Text(
              'My Counter: $_counter', // 添加显示自身计数器的文本
              style: TextStyle(fontSize: 18.0),
            ),
            SizedBox(height: 10.0),
            ElevatedButton(
              onPressed: () {
                widget.streamController.add(messageToSend);
              },
              child: Text('Send Message'),
            ),
            SizedBox(height: 10.0),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  _counter++;
                });
              },
              child: Text('Increase Counter'),
            ),
          ],
        ),
      ),
    );
  }
}

class Window2 extends StatefulWidget {
  final StreamController<String> streamController;
  final Stream<String> incomingStream;

  Window2({required this.streamController, required this.incomingStream});

  
  _Window2State createState() => _Window2State();
}

class _Window2State extends State<Window2> {
  int _counter = 0;
  String _receivedText = '';

  
  void initState() {
    super.initState();
    widget.incomingStream.listen((data) {
      setState(() {
        _receivedText = data;
      });
    });
  }

  
  Widget build(BuildContext context) {
    String messageToSend = 'Counter: $_counter';

    return Expanded(
      child: Container(
        decoration: BoxDecoration(
          border: Border.all(color: Colors.green, width: 2.0),
          color: Colors.green[100],
        ),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Received from Window 1:',
              style: TextStyle(fontSize: 18.0),
            ),
            SizedBox(height: 10.0),
            Text(
              _receivedText,
              style: TextStyle(fontSize: 24.0, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 20.0),
            Text(
              'My Counter: $_counter', // 添加显示自身计数器的文本
              style: TextStyle(fontSize: 18.0),
            ),
            SizedBox(height: 10.0),
            ElevatedButton(
              onPressed: () {
                widget.streamController.add(messageToSend);
              },
              child: Text('Send Message'),
            ),
            SizedBox(height: 10.0),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  _counter++;
                });
              },
              child: Text('Increase Counter'),
            ),
          ],
        ),
      ),
    );
  }
}

以下是对这段代码的分析:
一、整体结构
这段代码是一个使用 Flutter 框架构建的应用程序,实现了两个窗口(Window1和Window2)之间的通信以及各自的计数器功能。

二、主要部分分析
main函数
void main() { runApp(MyApp()); }:应用程序的入口点,启动应用并传入MyApp实例。

MyApp类
继承自StatelessWidget,在build方法中返回一个MaterialApp,设置了应用的主页面为MyHomePage。

MyHomePage类
继承自StatefulWidget,在createState方法中返回_MyHomePageState。

_MyHomePageState类:
包含两个StreamController:_streamControllerWindow1和_streamControllerWindow2,用于管理两个窗口之间的数据流。
在dispose方法中关闭两个StreamController以释放资源。
build方法:
构建一个Scaffold,其主体是一个水平排列的Row,包含Window1和Window2两个小部件,分别传入对应的StreamController和流入的Stream。

Window1类和Window2类
都继承自StatefulWidget,分别包含一个StreamController和一个流入的Stream。

对应的状态类_Window1State和_Window2State:
维护一个计数器_counter和接收到的文本_receivedText。
在initState方法中,监听流入的Stream,当有新数据时更新_receivedText。
build方法:构建一个带有边框和背景颜色的容器,内部包含描述文本、接收到的文本、自身计数器文本以及两个按钮,一个用于发送消息(调用对应的StreamController.add方法),一个用于增加自身计数器(通过setState更新_counter)。

三、功能总结
这个应用程序创建了两个窗口,每个窗口都有自己的计数器和接收区域。通过StreamController和Stream实现了两个窗口之间的通信,当一个窗口发送消息时,另一个窗口可以接收到并显示。同时,每个窗口还可以独立地增加自己的计数器。这种设计展示了 Flutter 中状态管理和数据流的使用方法,以及如何构建具有交互性的多窗口应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值