Flutter状态管理插件bloc_subject_provider的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter状态管理插件bloc_subject_provider的使用

bloc_subject_provider

响应式事件驱动的状态管理。实现了Bloc模式作为rxdart主题(BlocSubject)和一个新的主题作为riverpod提供器(BlocSubjectProvider)。

示例

主要代码

import 'package:bloc_subject_provider/bloc_subject_provider.dart';

// 定义一个BlocSubjectProvider实例,用于处理特定类型的事件和状态。
final blocSubjectProvider = BlocSubjectProvider<Event, int>((ref) => BlocSubject.seeded(
      1, // 初始状态为1
      handler: (event, state) {
        // 根据不同的事件类型,更新状态。
        switch (event) {
          case Event1(:final number):
            // 忽略打印
            print("event 1");
            return state + number;
          case Event2(:final number):
            // 忽略打印
            print("event 2");
            return state + number;
        }
      },
    ));

主应用代码

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

// 定义两个事件类
sealed class Event {}

class Event1 implements Event {
  int number;

  Event1(this.number);
}

class Event2 implements Event {
  int number;

  Event2(this.number);
}

void main() {
  // 使用ProviderScope包裹应用程序根节点,以支持Riverpod的依赖注入。
  runApp(const ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends ConsumerWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  Widget build(BuildContext context, WidgetRef ref) {
    // 监听BlocSubjectProvider的状态变化,并将其值显示在界面上。
    final count = ref.watch(blocSubjectProvider);

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$count',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () =>
            ref.read(blocSubjectProvider.subject).addEvent(Event1(1)),
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

更多关于Flutter状态管理插件bloc_subject_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter状态管理插件bloc_subject_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用bloc_subject_provider进行状态管理的代码示例。bloc_subject_provider是一个结合了blocriverpod的轻量级状态管理解决方案。它允许你使用Riverpod的依赖注入特性来管理bloc的状态。

首先,确保你已经在pubspec.yaml文件中添加了必要的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_bloc: ^8.0.0
  flutter_riverpod: ^1.0.0

然后,运行flutter pub get来安装这些依赖。

接下来,我们创建一个简单的计数器应用来演示bloc_subject_provider的使用。

1. 创建Bloc

首先,我们创建一个简单的计数器bloc

// counter_bloc.dart
import 'package:bloc/bloc.dart';
import 'package:riverpod/riverpod.dart';

class CounterEvent {
  const CounterEvent();
}

class Increment extends CounterEvent {}
class Decrement extends CounterEvent {}

class CounterState {
  final int count;

  const CounterState({required this.count});

  @override
  List<Object?> get props => [count];
}

class CounterBloc extends Bloc<CounterEvent, CounterState> {
  CounterBloc() : super(CounterState(count: 0));

  @override
  Stream<CounterState> mapEventToState(CounterEvent event) async* {
    if (event is Increment) {
      yield state.copyWith(count: state.count + 1);
    } else if (event is Decrement) {
      yield state.copyWith(count: state.count - 1);
    }
  }
}

final counterProvider = Provider<CounterBloc>((ref) {
  return CounterBloc();
});

2. 创建UI组件

然后,我们创建一个简单的UI组件来使用这个bloc

// main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'counter_bloc.dart';

void main() {
  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Counter App')),
        body: Center(
          child: CounterPage(),
        ),
      ),
    );
  }
}

class CounterPage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final counterBloc = ref.watch(counterProvider);

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          'You have pushed the button this many times:',
        ),
        Text(
          '${counterBloc.state.count}',
          style: Theme.of(context).textTheme.headline4,
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () => ref.read(counterProvider).add(Increment()),
          child: Text('Increment'),
        ),
        SizedBox(height: 10),
        ElevatedButton(
          onPressed: () => ref.read(counterProvider).add(Decrement()),
          child: Text('Decrement'),
        ),
      ],
    );
  }
}

3. 运行应用

现在,你可以运行你的Flutter应用。你应该看到一个简单的计数器界面,可以通过点击“Increment”和“Decrement”按钮来增加或减少计数器的值。

这个示例展示了如何使用bloc_subject_provider(尽管在这个示例中,我们实际上没有直接使用bloc_subject_provider包,因为Riverpod已经提供了足够的灵活性来管理bloc的状态。如果你需要更复杂的blocRiverpod的集成,比如响应式状态或更复杂的依赖注入,可以考虑使用flutter_blocriverpod的组合,如上面的例子所示)。

请注意,如果你确实需要bloc_subject_provider这个特定的包(尽管它不是一个广泛认可的包名,可能是某个特定项目或社区的自定义实现),你可能需要查阅该包的特定文档或源代码来了解如何集成和使用它。上面的示例提供了一个通用的方法来使用blocRiverpod进行状态管理。

回到顶部