Flutter开发 - rxdart使用要义,一看就会的rxdart使用讲解

2,873 阅读3分钟

什么是状态管理?

在flutter里面有一个词叫状态管理,通俗一点的讲叫数值变化或者数据传递。而在flutter中比较出名的状态管理是provider,provider在这章里先不讲,我们先来说说另一个用来管理状态的东西,rxdart。

什么是rxdart?

rxdart是类似于provider的一个pub库,可以用来监听数据的变化,从而达到数据传递和变更的效果。

rxdart的核心思想是什么?

rxdart的核心思想是使用单例,如果在当前界面来使用rxdart,那博主想说,这也太简单了,简直大材小用,所以博主要说的是不同界面间传值,监听的实现,这一过程离不开单例,因为单例可以保证监听的对象是一个不管在哪里使用都不会改变的对象,保证了唯一性,另一个就是stream的使用。

来看看效果

在这里插入图片描述
这是一种监听数据变化的实现方式,我们来看一下代码怎么监听:

首先引入rxdart

  rxdart: ^0.24.1

引入头文件

import 'package:rxdart/rxdart.dart';

建一个类用来添加要监听的对象

///此类中,是我们要用到的数据类,这里我们创建数据,监听数据
import 'package:rxdart/rxdart.dart';

class BehaviorData {
  ///被监听对象
  String changeContent;
  ///监听方
  final subject = BehaviorSubject();
  ///外部修改了被监听对象
  void change (text) {
    changeContent = text;
    ///将修改过后的被监听对象add到监听对象中,断点时可以看到里面有当前对象值和上一次
    ///的对象值,也就是前后对象值的对比,博主试了下,每次传过来同样的值,也会被监听,
    ///所以就是每一次变更都会被监听到
    subject.add(changeContent);
  } 
}

你以为这就完了?这只是打个底子,还需要桥梁来衔接起来,这个桥梁就是单例

import 'package:rxdart/rxdart.dart';
import 'behavior_data.dart';

///这里这么写是为了方便调用,不用写那么长
Subject get subject => DataManage.getInstance().getProvider().subject;

String get changeContent => DataManage.getInstance().getProvider().changeContent;
///这里是一个方便使用的赋值方法,内部也是调用了数据类的change方法来修改对应的数据
Future<void> changeValue(String text) async {
  return DataManage.getInstance().getProvider().change(text);
}

class DataManage {
  ///初始化数据类
  BehaviorData cDataModel = BehaviorData();
  ///以下为单例的基础用法
  static DataManage _instance;
  DataManage._internal();
  factory DataManage.getInstance() => _getInstance();

  static _getInstance() {
    if (_instance == null) {
      _instance = DataManage._internal();
    }
    return _instance;
  }
  ///这里是获取到同一个数据类对象,如果每次都重新创建,那肯定数据是有问题的,为什么多
  ///写一个方法作为衔接,是因为这里可以判断条件获取不同的数据类,博主这里只写了一个,
  ///但是对应用法还是要说明下
  BehaviorData getProvider() {
    return cDataModel;
  }
}

在哪里监听?

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    ///被监听对象是changeContent,这里的changeContent就是单例类中简化的获取数据
    ///类参数的get方法,不要写错哦
    subject.stream.listen((changeContent) {
      setState(() {

      });
    });

  }

华丽丽的分割线



以上便是关于raxdart传值,监听的使用,有不明白的,可以留言讨论哦。