Как использовать шаблон Flutter BLoC в определенных сценариях?

Недавно я начал изучать Flutter и его часть BLoC, и в библиотеке BLoC есть много классов, таких как Bloc, PublishSubject, StreamController, BehaviorSubject и т. Д.

У меня вопрос, в каких сценариях я могу использовать эти классы? Например, я могу унаследовать от bloc или не унаследовать от него, но почему? Я не понимаю, каковы сценарии использования этих классов?


person Kevin Zhang    schedule 26.02.2021    source источник


Ответы (1)


Как видите, есть несколько способов реализовать Bloc в ваших приложениях. Упомянутый вами выше класс фактически принадлежит к разным пакетам: PublishSubject и BehaviorSubject из пакета rxdart, а StreamController - в пакете Flutter SDK dart: async

Однако от вас не требуется использовать все или даже какие-либо из них для реализации Bloc в ваших приложениях Flutter. Я сделаю пример, реализовав Bloc без использования какого-либо пакета:

1. Реализуйте Bloc обычным способом:
Вы можете реализовать Bloc, используя то, что есть в Flutter SDK, без использования других пакетов. Обычно вы создаете блочный класс, отделяющий вашу логику от пользовательского интерфейса. Класс может выглядеть так:

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();
  }
}

Тем временем в пользовательском интерфейсе вы запускаете 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_bloc или rxdart. flutter_bloc обеспечивает способ согласованной структуры вашего блока с использованием концепций блока / события / состояния, rx_dart предоставляет множество инструментов, так что вы можете манипулировать Stream по своему усмотрению. Вы также можете увидеть людей, упомянутых provider, его основная цель - передать объект вниз по дереву виджетов и создать поток данных через ваше приложение.

Каждый из них уже достаточно зрел и реализован многими программистами. Я рекомендую изучать документацию каждого из них только после реализации Bloc ванильным способом, чтобы вы действительно могли понять, что они делают за кулисами.

person Bach    schedule 26.02.2021
comment
Спасибо за помощь! - person Kevin Zhang; 26.02.2021