Flutter插件tbloc_dart的使用方法

tBloC Dart

Build Status

一个帮助你实现BLoC(业务逻辑组件)模式的Dart库。

潜在使用示例

下面是一个完整的示例,展示了如何使用tbloc_dart插件来实现一个简单的计数器应用。

示例代码

main.dart

import 'dart:developer';

import 'package:fastyle_dart/fastyle_dart.dart';
import 'package:tbloc_dart/tbloc_dart.dart';
import 'package:flutter/material.dart';
import 'counter.bloc.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return FastApp(
      home: MyHomePage(),
    );
  }
}

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

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

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

  [@override](/user/override)
  void initState() {
    super.initState();

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FastSectionPage(
      showAppBar: false,
      titleText: 'tBloc Demo',
      child: 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 FastThreeBounceIndicator();
            },
          ),
        ),
      ),
    );
  }

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

  buildActions() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        FastRaisedButton(
          text: 'INCREMENT',
          onTap: () {
            bloc.addEvent(CounterBlocEvent.increment());
          },
        ),
        FastRaisedButton(
          text: 'DECREMENT',
          onTap: () {
            bloc.addEvent(CounterBlocEvent.decrement());
          },
        ),
        FastRaisedButton(
          text: 'RESET',
          onTap: () {
            bloc.addEvent(CounterBlocEvent.reset());
          },
        ),
        FastRaisedButton(
          text: 'ERROR',
          onTap: () => bloc.addEvent(CounterBlocEvent.error()),
        ),
      ],
    );
  }
}

class StatusWidget extends StatelessWidget {
  [@override](/user/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 {
  [@override](/user/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.headline4,
        );
      },
    );
  }
}

更多关于Flutter插件tbloc_dart的使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


在 Flutter 开发中,tbloc_dart 并不是官方或广泛使用的插件,因此它的具体功能和用途可能不太明确。如果 tbloc_dart 是一个特定的自定义插件或库,以下是一些可能的用途和功能假设,以及如何在 Flutter 中使用它的建议:


1. 状态管理

  • 如果 tbloc_dart 是一个状态管理库(类似于 BLoCRiverpod),它可能用于管理应用程序的状态。
  • 你可能需要定义 BlocCubit 类,并通过它来管理业务逻辑和状态更新。
  • 使用 TBlocProvider 来提供状态,并在 UI 层使用 TBlocBuilderTBlocListener 来响应状态变化。

示例代码:

class CounterBloc extends TBloc<int> {
  CounterBloc() : super(0);

  void increment() => emit(state + 1);
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return TBlocProvider(
      create: (_) => CounterBloc(),
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(title: Text('TBloc Example')),
          body: TBlocBuilder<CounterBloc, int>(
            builder: (context, state) {
              return Center(
                child: Text('Count: $state'),
              );
            },
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () => context.read<CounterBloc>().increment(),
            child: Icon(Icons.add),
          ),
        ),
      ),
    );
  }
}

2. 依赖注入

  • tbloc_dart 可能用于实现依赖注入(Dependency Injection),类似于 ProviderGetIt
  • 你可以使用它来注入服务、数据源或其他依赖项,并在应用程序中共享它们。

示例代码:

class UserService {
  String getUserName() => 'John Doe';
}

TBlocProvider(
  create: (_) => UserService(),
  child: HomePage(),
);

3. 路由管理

  • 如果 tbloc_dart 是一个路由管理库,它可能用于简化页面导航。
  • 你可以使用它来定义路由、传递参数,并在不同页面之间导航。

示例代码:

TBlocRouter(
  initialRoute: '/',
  routes: {
    '/': (context) => HomePage(),
    '/details': (context) => DetailsPage(),
  },
);

4. HTTP 请求或 API 集成

  • 如果 tbloc_dart 是一个网络请求库,它可能封装了与 REST API 或 GraphQL 的交互。
  • 你可以使用它来发送 HTTP 请求、处理响应数据,并将其与状态管理结合。

示例代码:

class ApiService {
  Future<List<Post>> fetchPosts() async {
    final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));
    return postFromJson(response.body);
  }
}

class PostBloc extends TBloc<List<Post>> {
  final ApiService apiService;

  PostBloc(this.apiService) : super([]);

  void fetchPosts() async {
    final posts = await apiService.fetchPosts();
    emit(posts);
  }
}

5. 工具库

  • tbloc_dart 可能是一个工具库,提供了诸如日期格式化、字符串处理、本地存储等实用功能。
  • 你可以直接在项目中导入并使用这些工具函数或类。

示例代码:

TBlocStorage.saveString('key', 'value');
final value = TBlocStorage.getString('key');

6. 插件或原生桥接

  • 如果 tbloc_dart 是一个插件,它可能用于与原生平台(如 Android 或 iOS)进行交互。
  • 你可以使用它来访问设备功能(如相机、GPS)或调用原生 API。

示例代码:

final result = await TBlocPlugin.getDeviceInfo();
print(result);
回到顶部