Flutter扩展功能插件tbib_bloc_extensions的使用

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

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

1 回复

更多关于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_bloctbib_bloc_extensions的版本兼容。
  • tbib_bloc_extensions可能包含一些额外的扩展方法或类,具体使用方法请参考其官方文档或源代码。

希望这个示例能帮你开始使用tbib_bloc_extensions插件。如果你有更具体的需求或问题,欢迎继续提问!

回到顶部