Flutter位置服务或区块管理插件tBloc的使用

Flutter位置服务或区块管理插件tBloc的使用

在本示例中,我们将展示如何使用tBloc插件来实现一个简单的计数器应用。tBloc是一个用于实现BLoC(业务逻辑组件)模式的Dart库。

首先,我们需要安装tBloc插件。请确保在pubspec.yaml文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  tbloc: ^x.x.x

然后运行flutter pub get来获取最新的包。

接下来,我们通过示例代码来了解tBloc的基本用法。


示例代码

// 忽略过长的行
// Flutter 引入
import 'package:flutter/material.dart';

// 包引入
import 'package:tbloc/tbloc.dart';

// 项目引入
import 'counter.bloc.dart';

void main() => runApp(const MyApp());

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyHomePage(),
      title: 'tBloc Demo',
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final bloc = CounterBloc();

  @override
  void initState() {
    super.initState();

    bloc.addEvent(const CounterBlocEvent.init());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: BlocProvider(
        bloc: bloc,
        child: Center(
          child: BlocBuilderWidget<CounterBlocState>(
            bloc: bloc,
            onlyWhenInitializing: true,
            builder: (context, state) {
              debugPrint(
                '_MyHomePageState: is building only if isInitializing or isInitialized have changed',
              );

              debugPrint('StatusWidget:isInitialized: ${state.isInitialized}');
              debugPrint(
                'StatusWidget:isInitializing: ${state.isInitializing}',
              );

              if (state.isInitialized) {
                return buildContent();
              }

              return const SizedBox.shrink();
            },
          ),
        ),
      ),
    );
  }

  Widget buildContent() {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        buildActions(),
        const Spacer(),
        const Text('You have pushed the button this many times:'),
        const Spacer(),
        const CounterWidget(),
        const Spacer(),
        const StatusWidget(),
      ],
    );
  }

  Widget buildActions() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          child: const Text('INCREMENT'),
          onPressed: () {
            bloc.addEvent(const CounterBlocEvent.increment());
          },
        ),
        ElevatedButton(
          child: const Text('DECREMENT'),
          onPressed: () {
            bloc.addEvent(const CounterBlocEvent.decrement());
          },
        ),
        ElevatedButton(
          child: const Text('RESET'),
          onPressed: () {
            bloc.addEvent(const CounterBlocEvent.reset());
          },
        ),
        ElevatedButton(
          child: const Text('ERROR'),
          onPressed: () => bloc.addEvent(const CounterBlocEvent.error()),
        ),
      ],
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    final bloc = BlocProvider.of<CounterBloc>(context);

    return BlocBuilderWidget(
      bloc: bloc,
      forceBuildWhenInializating: false,
      // forceBuildWhenBusy: false,
      buildWhen: (previous, next) {
        return previous.hasError != next.hasError;
      },
      builder: (BuildContext context, CounterBlocState state) {
        debugPrint(
          'StatusWidget: is building only if hasError or isBusy haved changed',
        );
        debugPrint('StatusWidget:hasError: ${state.hasError}');
        debugPrint('StatusWidget:isBusy: ${state.isBusy}');

        return Text(
          state.hasError ? state.error.toString() : 'No Error',
        );
      },
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    final bloc = BlocProvider.of<CounterBloc>(context);

    return BlocBuilderWidget(
      bloc: bloc,
      builder: (BuildContext context, CounterBlocState state) {
        return Text(
          state.hasError ? state.error.toString() : '${state.counter}',
          style: Theme.of(context).textTheme.headlineMedium,
        );
      },
    );
  }
}

解释

  1. 导入必要的库

    import 'package:flutter/material.dart';
    import 'package:tbloc/tbloc.dart';
    
  2. 创建主应用类

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return const MaterialApp(
          home: MyHomePage(),
          title: 'tBloc Demo',
        );
      }
    }
    
  3. 创建状态管理类

    class MyHomePage extends StatefulWidget {
      const MyHomePage({super.key});
    
      @override
      State<MyHomePage> createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      final bloc = CounterBloc();
    
      @override
      void initState() {
        super.initState();
        bloc.addEvent(const CounterBlocEvent.init());
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: BlocProvider(
            bloc: bloc,
            child: Center(
              child: BlocBuilderWidget<CounterBlocState>(
                bloc: bloc,
                onlyWhenInitializing: true,
                builder: (context, state) {
                  ...
                },
              ),
            ),
          ),
        );
      }
    }
    
  4. 创建页面内容

    Widget buildContent() {
      return Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          buildActions(),
          const Spacer(),
          const Text('You have pushed the button this many times:'),
          const Spacer(),
          const CounterWidget(),
          const Spacer(),
          const StatusWidget(),
        ],
      );
    }
    
    Widget buildActions() {
      return Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            child: const Text('INCREMENT'),
            onPressed: () {
              bloc.addEvent(const CounterBlocEvent.increment());
            },
          ),
          ElevatedButton(
            child: const Text('DECREMENT'),
            onPressed: () {
              bloc.addEvent(const CounterBlocEvent.decrement());
            },
          ),
          ElevatedButton(
            child: const Text('RESET'),
            onPressed: () {
              bloc.addEvent(const CounterBlocEvent.reset());
            },
          ),
          ElevatedButton(
            child: const Text('ERROR'),
            onPressed: () => bloc.addEvent(const CounterBlocEvent.error()),
          ),
        ],
      );
    }
    
  5. 创建状态显示组件

    class StatusWidget extends StatelessWidget {
      const StatusWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        final bloc = BlocProvider.of<CounterBloc>(context);
    
        return BlocBuilderWidget(
          bloc: bloc,
          forceBuildWhenInializating: false,
          buildWhen: (previous, next) {
            return previous.hasError != next.hasError;
          },
          builder: (BuildContext context, CounterBlocState state) {
            debugPrint(
              'StatusWidget: is building only if hasError or isBusy haved changed',
            );
            debugPrint('StatusWidget:hasError: ${state.hasError}');
            debugPrint('StatusWidget:isBusy: ${state.isBusy}');
    
            return Text(
              state.hasError ? state.error.toString() : 'No Error',
            );
          },
        );
      }
    }
    
  6. 创建计数器显示组件

    class CounterWidget extends StatelessWidget {
      const CounterWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        final bloc = BlocProvider.of<CounterBloc>(context);
    
        return BlocBuilderWidget(
          bloc: bloc,
          builder: (BuildContext context, CounterBlocState state) {
            return Text(
              state.hasError ? state.error.toString() : '${state.counter}',
              style: Theme.of(context).textTheme.headlineMedium,
            );
          },
        );
      }
    }

更多关于Flutter位置服务或区块管理插件tBloc的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter位置服务或区块管理插件tBloc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


尽管tbloc这个插件的具体功能和官方文档未明确给出,但基于其名称“tbloc”,我们可以合理推测它可能与Flutter中的状态管理或区块管理(BLoC模式,即Business Logic Component)有关。在Flutter中,BLoC模式是一种常用的状态管理策略,尤其适用于复杂的应用逻辑。

以下是一个基于BLoC模式的简单示例代码,展示如何在Flutter中使用BLoC进行状态管理。请注意,此示例并不是针对tbloc插件的具体实现,而是展示BLoC模式的基本用法。如果你发现tbloc确实是一个BLoC模式的实现库,那么以下代码将为你提供一个理解其使用方式的起点。

1. 创建BLoC事件和状态

首先,我们需要定义BLoC事件和状态。事件是触发BLoC逻辑更新的输入,而状态是BLoC逻辑处理后的输出。

// counter_event.dart
abstract class CounterEvent {}

class IncrementEvent extends CounterEvent {}
class DecrementEvent extends CounterEvent {}

// counter_state.dart
abstract class CounterState {}

class CounterInitialState extends CounterState {
  final int count;
  CounterInitialState({required this.count});
}

2. 创建BLoC

接下来,我们创建一个BLoC类来处理事件并生成新的状态。

// counter_bloc.dart
import 'dart:async';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_event.dart';
import 'counter_state.dart';

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

  @override
  Stream<CounterState> mapEventToState(CounterEvent event) async* {
    if (event is IncrementEvent) {
      yield* _handleIncrementEvent();
    } else if (event is DecrementEvent) {
      yield* _handleDecrementEvent();
    }
  }

  Stream<CounterState> _handleIncrementEvent() async* {
    final currentState = state as CounterInitialState;
    yield CounterInitialState(count: currentState.count + 1);
  }

  Stream<CounterState> _handleDecrementEvent() async* {
    final currentState = state as CounterInitialState;
    yield CounterInitialState(count: currentState.count - 1);
  }
}

3. 使用BLoC在UI中显示状态

最后,我们在Flutter的UI组件中使用BLoCProvider和BLoCBuilder来监听BLoC的状态并更新UI。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter BLoC Example')),
        body: Center(
          child: BlocProvider<CounterBloc>(
            create: (context) => CounterBloc(),
            child: CounterPage(),
          ),
        ),
        floatingActionButton: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.end,
          children: <Widget>[
            FloatingActionButton(
              onPressed: () => context.read<CounterBloc>().add(IncrementEvent()),
              tooltip: 'Increment',
              child: Icon(Icons.add),
            ),
            SizedBox(height: 10),
            FloatingActionButton(
              onPressed: () => context.read<CounterBloc>().add(DecrementEvent()),
              tooltip: 'Decrement',
              child: Icon(Icons.remove),
            ),
          ],
        ),
      ),
    );
  }
}

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocBuilder<CounterBloc, CounterState>(
      builder: (context, state) {
        if (state is CounterInitialState) {
          return Text('${state.count}');
        }
        return Text('Unknown State');
      },
    );
  }
}

总结

上述代码展示了如何在Flutter中使用BLoC模式进行状态管理。如果你发现tbloc插件确实与BLoC模式相关,那么你可能需要查阅其官方文档或源码来了解其特有的API和用法。不过,上述示例提供了一个基本的框架,帮助你理解如何在Flutter中实现BLoC模式。

回到顶部