微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在特定场景中使用 Flutter BLoC 模式?

如何解决如何在特定场景中使用 Flutter BLoC 模式?

最近开始学习Flutter及其BLoC partten,BLoC库中有很多类,比如BlocPublishSubjectStreamControllerBehaviorSubject等..

我的问题是,我可以在哪些场景中使用这些类?例如,我可以从 bloc 继承或不从它继承,但为什么呢?我很困惑,这些类的使用场景是什么?

解决方法

如您所见,在您的应用中实现 Bloc 的方法不止一种。您上面提到的类实际上来自不同的包:PublishSubjectBehaviorSubject 来自 rxdart 包,而 StreamController 位于 Flutter SDK 包 dart:async>

然而,在 Flutter 应用程序中实现 Bloc 并不需要全部或什至使用它们中的任何一个。我将在不使用任何包的情况下通过实现 Bloc 来做一个例子:

1.以原版方式实现 Bloc:
您可以使用 Flutter SDK 中的内容来实现 Bloc,而无需使用其他包。通常您会创建一个 bloc 类,将您的逻辑与 UI 分开。该类可能如下所示:

import 'dart:async';

// This is the class that handle all the logic such as receiving data from API,process those data,etc (I'll call it a data processing unit)
class YourBloc {
  
  // Create a stream to send processed data to the UI
  final StreamController _someController = StreamController();

  Stream get someStream => _someController.stream;

  // Get the data from API,then send the data to stream here. Usually an async function
  void loadData() async {
    final data = await doYourApiCall(); // Get data from API
    var processedData = processYourData(data);
    _someController.add(processedData);
  }

  dispose() {
    _someController.close();
  }
}

同时在 UI 中,您启动 loadData() 并使用 StreamBuilder 侦听响应数据:

class _SomeScreenState extends State<SomeScreen> {
  // Initiate your bloc
  final YourBloc _bloc = YourBloc();

  // Make the loadData() call
  @override
  void initState() {
    _bloc.loadData();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder( // Listen to the datastream with StreamBuilder
      stream: _bloc.someStream,builder: (context,snapshot) {
        if (!snapshot.hasData)
          return Center(child: CircularProgressIndicator());
        return ListView.builder(
          itemCount: snapshot.data.length,itemBuilder: (context,index) => _buildYourItem(index),);
      },);
  }
}

2.那么这些包是干什么用的 您可以使用一些包来实现 Bloc,例如 flutter_blocrxdartflutter_bloc 提供了一种使用 Bloc/Event/State 概念一致地构建您的组的方法,rx_dart 提供了许多工具,因此您可以根据自己的需要操作 Stream。您可能还会看到有人提到 provider,它的主要目的是将一个对象向下传递到小部件树并在您的应用中创建数据流。

每一个都已经相当成熟并被许多程序员实现。我建议您仅在以普通方式实施 Bloc 之后再查看每个文档的文档,这样您就可以真正了解他们在幕后所做的事情。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。