StreamContrller实现局部刷新和生产者消费者模式

1、定义一个ViewModel便于StreamControlerl被多个类访问
import 'dart:async';

class StreamViewModel{
  int count=0;
  final StreamController<String> streamController = StreamController.broadcast();

}

2在HomePage中初始化ViewModel,并将ViewMode传递到PageOne,pageTwo中;并监听Count值的变化

import 'dart:async';
import 'package:date_format/date_format.dart';
import 'package:flutter/material.dart';
import 'package:flutter_demos/page1.dart';
import 'package:flutter_demos/page2.dart';
import 'package:flutter_demos/strem_viewmodel.dart';
class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);
  @override
  State<StatefulWidget> createState() {
    return _TestABPageState();
  }
}
class _TestABPageState extends State {
  late StreamViewModel viewModel;

  @override
  void initState() {
    super.initState();
    viewModel=StreamViewModel();
  }

  @override
  void dispose() {
    super.dispose();
    viewModel.streamController.close();
  }
  @override
  Widget build(BuildContext context) {
    ///页面主体脚手架
    return Scaffold(
      appBar: AppBar(
        title: const Text("homepage"),
      ),
      body:Column(
        children: [
          buildStreamBuilder(),
          TextButton(onPressed: (){
            Navigator.push(context, new MaterialPageRoute(builder: (context)=>new PageOne(viewModel: viewModel,)));
          }, child:const Text(
            'page1',
            style: TextStyle(fontSize: 22, color: Colors.blue),
          ) ) ,
          TextButton(onPressed: (){
            Navigator.push(context, new MaterialPageRoute(builder: (context)=>new PageTwo(viewModel: viewModel,)));

          }, child:const Text(
            'page2',
            style: TextStyle(fontSize: 22, color: Colors.blue),
          ) ),

        ],
      )

    );
  }

  ///代码清单1-1
  /// 监听Stream,每次值改变的时候,更新Text中的内容
  StreamBuilder<String> buildStreamBuilder() {
    return
      StreamBuilder<String>(
      ///绑定stream
      stream: viewModel.streamController.stream,
      ///默认的数据
      initialData: viewModel.count.toString(),
      ///构建绑定数据的UI
      builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
        ///snapshot.data 就是传递的数据对象
        return Text(
          '当前值  ${snapshot.data} ',
          style: const TextStyle(fontSize: 22, color: Colors.blue),
        );
      },
    );
  }
}

2在PageOne,pageTwo中,添加出发监听;并监听Count值的变化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值