Skip to content

2.設定transaction bloc

先設定lib\bloc\transaction_bloc.dart

Code

import 'dart:math';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hive/hive.dart';
import '../models/expense.dart';

part 'transaction_event.dart';
part 'transaction_state.dart';

class TransactionBloc extends Bloc<TransactionEvent, TransactionState> {
  final Box<Transaction> transactionBox;

  TransactionBloc(this.transactionBox) : super(TransactionInitial()) {
    loadTransactions();

    on<AddTransaction>((event, emit) {
      final newTransaction = event.transaction;
      transactionBox.put(newTransaction.key, newTransaction);
      emit(TransactionsLoaded(_getTransactions()));
    });

    on<DeleteTransaction>((event, emit) {
      transactionBox.delete(event.transaction.key);
      emit(TransactionsLoaded(_getTransactions()));
    });

    on<ClearTransactions>((event, emit) async {
      transactionBox.clear();
      await Future.delayed(Duration(milliseconds: 1000));
      emit(TransactionsLoaded(_getTransactions()));
    });
  }

  void loadTransactions() {
    emit(TransactionsLoaded(_getTransactions()));
  }

  List<Transaction> _getTransactions() {
    return transactionBox.values.toList();
  }
}

解釋

交易Bloc簡介

在Flutter中,Bloc(Business Logic Component)是一種用於管理應用程序狀態和處理用戶交互的設計模式。在給定的代碼片段中,我們看到了一個名為TransactionBloc的類,它是一個Bloc,負責管理交易相關的業務邏輯。

代碼解釋

  1. 導入依賴項:

    import 'dart:math'; // 導入數學庫
    import 'package:flutter_bloc/flutter_bloc.dart'; // 導入Flutter Bloc庫
    import 'package:hive/hive.dart'; // 導入Hive庫,用於數據持久化
    import '../models/expense.dart'; // 導入交易模型類
    

  2. 聲明Bloc類:

    class TransactionBloc extends Bloc<TransactionEvent, TransactionState> {
    

    • TransactionBloc 類繼承自 Bloc 類,指定了 TransactionEvent 作為輸入事件和 TransactionState 作為狀態。
  3. 構造函數:

    TransactionBloc(this.transactionBox) : super(TransactionInitial()) {
        loadTransactions();
        // 初始化時加載交易數據,並定義了三種事件處理函數
    }
    

    • 構造函數接受一個名為transactionBox的參數,它是一個Hive盒子,用於存儲交易數據。在構造函數中,首先調用loadTransactions()方法加載交易數據,然後調用super(TransactionInitial())初始化Bloc的初始狀態為TransactionInitial()
  4. 事件處理:

    on<AddTransaction>((event, emit) {
        final newTransaction = event.transaction;
        transactionBox.put(newTransaction.key, newTransaction);
        emit(TransactionsLoaded(_getTransactions()));
    });
    on<DeleteTransaction>((event, emit) {
        transactionBox.delete(event.transaction.key);
        emit(TransactionsLoaded(_getTransactions()));
    });
    on<ClearTransactions>((event, emit) async {
        transactionBox.clear();
        await Future.delayed(Duration(milliseconds: 1000));
        emit(TransactionsLoaded(_getTransactions()));
    });
    

    • 使用on方法定義了三種不同的事件處理函數,分別處理添加、刪除和清除交易的事件。
    • 當接收到AddTransaction事件時,將新的交易數據存儲到transactionBox中,並發出TransactionsLoaded狀態。
    • 當接收到DeleteTransaction事件時,從transactionBox中刪除指定的交易數據,並發出TransactionsLoaded狀態。
    • 當接收到ClearTransactions事件時,清空transactionBox中的所有交易數據,並發出TransactionsLoaded狀態,但在此之前會延遲一秒鐘以模擬異步操作。
  5. 輔助方法:

    void loadTransactions() {
        emit(TransactionsLoaded(_getTransactions()));
    }
    
    List<Transaction> _getTransactions() {
        return transactionBox.values.toList();
    }
    

    • loadTransactions()方法用於加載交易數據並發出TransactionsLoaded狀態。
    • _getTransactions()方法用於從transactionBox中獲取所有交易數據並返回一個列表。

總結

TransactionBloc類負責管理交易相關的業務邏輯,它通過處理不同的事件來添加、刪除和清除交易數據,並根據操作結果發出相應的狀態。


Last update : 13 novembre 2024
Created : 13 novembre 2024

Comments

Comments