Flutter扩展功能插件tbib_bloc_extensions的使用
Flutter扩展功能插件tbib_bloc_extensions的使用
使用此扩展可以不通过上下文获取您的BLoC。
注意 v1.0.2 解决无法在runApp
中获取BLoC的问题
// 1- 需要创建导航键
GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
// 2 在MaterialApp或CupertinoApp中
MitXMaterialApp(
navigatorKey: navigatorKey,
...
builder: (context, child) {
TBIBBlocExt.init(navigatorKey);
...
return child!;
}
);
使用方法
// 不要使用BlocProvider(),而是使用BlocProviderContext
BlocProviderContext(
create: (context) => YourBloc(),
child: child
);
当需要获取您的BLoC时
// 不要使用BlocProvider.of<YourBloc>(context),而是使用
BlocExt.getBloc<YourBloc>();
查看库的工作原理
// widget BlocProviderContext
@Override
Widget build(BuildContext context) {
return BlocProvider(
create: create,
child: Builder(builder: (context) {
BlocExt.setBlocContext = context; // 看,我获取了您的上下文并将其发送到静态变量
return child;
}),
);
}
BlocExt.getBloc<YourBloc>() // 它使用BlocProvider.of<T>(_blocContext)
示例代码
以下是一个完整的示例代码:
import 'package:example/bloc/my_bloc_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:tbib_bloc_extensions/tbib_bloc_extensions.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// 此小部件是您的应用程序的根。它是有状态的,这意味着
// 它有一个包含影响其外观的字段的状态对象。
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// 这是您的应用程序的主题。
//
// 尝试运行您的应用程序,例如使用"flutter run"。您会看到
// 应用程序有一个蓝色工具栏。然后,在不停止应用程序的情况下尝试
// 将主色更改为Colors.green并调用
// "热重载"(在运行"flutter run"的控制台中按"r",或者简单地保存更改以进行"热重载")。
// 注意计数器没有重置回零;应用程序
// 没有重新启动。
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: '获取BLoC而无需上下文'),
);
}
}
class MyHomePage extends StatefulWidget {
// 这个小部件是您的应用程序的主页。它是有状态的,意味着
// 它有一个状态对象(定义如下),该对象包含影响其外观的字段。
// 小部件子类中的字段总是标记为"final"。
final String title;
const MyHomePage({super.key, required this.title});
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
[@override](/user/override)
Widget build(BuildContext context) {
// 此方法每次调用setState时都会被重新运行,例如由上面的_incrementCounter方法所做。
//
// Flutter框架已优化为使重建方法快速运行,因此您可以只需重建任何需要更新的东西,
// 而不必逐个更改小部件实例。
return Scaffold(
appBar: AppBar(
// 这里我们从MyHomePage对象中获取值,该对象是由
// App.build方法创建的,并用于设置我们的应用栏标题。
title: Text(widget.title),
),
body: BlocProviderContext(
create: (context) => MyBlocBloc(),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
BlocBuilder<MyBlocBloc, MyBlocState>(
builder: (context, state) {
MyBlocBloc bloc = MyBlocBloc.get(context);
return Text(
bloc.alert,
style: const TextStyle(fontSize: 30, color: Colors.blue),
);
},
)
],
),
),
));
}
}
更多关于Flutter扩展功能插件tbib_bloc_extensions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter扩展功能插件tbib_bloc_extensions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用tbib_bloc_extensions
插件的一个示例代码案例。这个插件通常用于扩展Bloc模式的一些功能,使得状态管理更加灵活和高效。假设你已经安装并配置好了Flutter和Dart环境,以下是具体的步骤和代码示例:
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加tbib_bloc_extensions
依赖:
dependencies:
flutter:
sdk: flutter
flutter_bloc: ^8.0.0 # 确保flutter_bloc版本兼容
tbib_bloc_extensions: ^最新版本号 # 替换为实际最新版本号
然后运行flutter pub get
来安装依赖。
2. 创建Bloc和事件
接下来,定义一个简单的事件和状态,以及一个Bloc来处理这些事件。
events.dart
import 'package:equatable/equatable.dart';
abstract class CounterEvent extends Equatable {
const CounterEvent();
@override
List<Object?> get props => [];
}
class IncrementEvent extends CounterEvent {}
class DecrementEvent extends CounterEvent {}
states.dart
import 'package:equatable/equatable.dart';
class CounterState extends Equatable {
final int count;
const CounterState({required this.count});
@override
List<Object?> get props => [count];
CounterState copyWith({int? count}) {
return CounterState(count: count ?? this.count);
}
}
counter_bloc.dart
import 'package:bloc/bloc.dart';
import 'package:tbib_bloc_extensions/tbib_bloc_extensions.dart'; // 引入扩展
import 'events.dart';
import 'states.dart';
class CounterBloc extends Bloc<CounterEvent, CounterState> with BlocExtensions {
CounterBloc() : super(CounterState(count: 0)) {
on<IncrementEvent>((event, emit) {
emit(state.copyWith(count: state.count + 1));
});
on<DecrementEvent>((event, emit) {
emit(state.copyWith(count: state.count - 1));
});
}
}
3. 使用BlocBuilder构建UI
在你的Flutter应用中,使用BlocBuilder
来监听Bloc的状态变化并更新UI。
main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_bloc.dart';
import 'states.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Counter App')),
body: Center(
child: BlocProvider(
create: (_) => CounterBloc(),
child: BlocBuilder<CounterBloc, CounterState>(
builder: (context, state) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'${state.count}',
style: Theme.of(context).textTheme.headline4,
),
],
);
},
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
context.read<CounterBloc>().add(IncrementEvent());
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
),
);
}
}
4. 使用BlocExtensions功能
虽然上面的代码没有直接使用tbib_bloc_extensions
的特定功能,但这个插件通常提供了额外的Bloc工具和方法,比如更高级的转换、监听或条件处理等。你可以查阅该插件的文档来了解更多特定功能的使用方法。
注意事项
- 确保
flutter_bloc
和tbib_bloc_extensions
的版本兼容。 tbib_bloc_extensions
可能包含一些额外的扩展方法或类,具体使用方法请参考其官方文档或源代码。
希望这个示例能帮你开始使用tbib_bloc_extensions
插件。如果你有更具体的需求或问题,欢迎继续提问!