iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Mobile Development

在 Flutter 開發旅程的手札系列 第 21

Flutter Package - Bloc(一)

  • 分享至 

  • xImage
  •  

今天要來介紹flutter_bloc,當程式碼越寫越多的時候,很常發生介面與邏輯全部都混在一起,且邏輯可能會有很多if else層層堆疊的狀況,這不僅讓程式碼越來越難維護,也會容易改A壞B的狀況。

今天要介紹的Bloc最核心的重點就是UI行為和商業邏輯分開,今天會先介紹Cubit,他適合簡易狀態的時候使用,也比較好入門

建立counter_cubit.dart
初始值設定方法
1.預設帶入0:CounterCubit() : super(0);
2.在使用CounterCubit時傳入:CounterCubit({required int count}): super(count);
在CounterCubit內建立兩個事件incrementdecrementreset
emit是觸發方法來更新狀態
state是拿到當前的狀態

import 'package:flutter_bloc/flutter_bloc.dart';

class CounterCubit extends Cubit<int> {
  CounterCubit({required int count}) : super(count);

  void increment() => emit(state + 1);
  void decrement() => emit(state - 1);
  void reset() => emit(0);
}

建立cubit_screen.dart
BlocProvider是提供底下的child Widgets有Cubit使用的環境
BlocBuilder當狀態改變時,Builder內的return Widget都會改變

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

import 'counter_cubit.dart';

class CubitScreen extends StatelessWidget {
  const CubitScreen({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: const Text('Counter')),
        body: BlocProvider(
          create: (_) => CounterCubit(),
          child: BlocBuilder<CounterCubit, int>(builder: (context, count) {
            return Center(
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  ElevatedButton(
                    onPressed: () {
                      context.read<CounterCubit>().decrement();
                    },
                    child: Icon(Icons.remove),
                  ),
                  Text(count.toString()),
                  ElevatedButton(
                    onPressed: () {
                      context.read<CounterCubit>().increment();
                    },
                    child: Icon(Icons.add),
                  ),
                ],
              ),
            );
          }),
        ));
  }
}

Cubit Demo


上一篇
Flutter Package — 用日曆選擇日期
下一篇
Flutter Package - Bloc(二)
系列文
在 Flutter 開發旅程的手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言