Flutter:块/库比特状态管理中的异步方法

06odsfpq  于 2023-11-21  发布在  Flutter
关注(0)|答案(2)|浏览(121)

在使用Cubit状态管理时,我有一个问题,Cubit类中访问Repository类的方法是否必须是Cubit c?Repository类中访问远程DB的方法当然是Cubit c,但为什么Cubit类中的方法应该是Cubit c?
以下是相关的代码片段:

腕尺等级:

  Future<void> getAllCost() async {

    emit(
      state.copyWith(status: ManageCostStatus.loading),
    );

    try {
      late List<Cost> costs = [];
      costs = await supabaseRepsitory.getAllCost();

      emit(state.copyWith(
        status: ManageCostStatus.success,
        costs: costs,
      ));

    } on Exception {
      emit(state.copyWith(status: ManageCostStatus.error));
    }
  }

字符串

仓库类

Future<List<Cost>> getAllCost() async {
    final dataCost = await supabaseInstance
        .from('notes')
        .select<List<Map<String, dynamic>>>(); 

    List<Cost> costList = List<Cost>.from(
        dataCost.map((e) => Cost.fromMap(e))); 

    return costList;
  }


老实说,我想让Cubit方法同步,因为同步方法和变量在Screen类中更容易处理。

mbjcgjjk

mbjcgjjk1#

它必须是cubic,因为你调用cubic代码。这是正常的,很好。如果你真的想避免cubic方法,你可以:

void getAllCost() {
  emit(
    state.copyWith(status: ManageCostStatus.loading),
  );

  supabaseRepsitory.getAllCost().then((costs) {
    emit(
      state.copyWith(
        status: ManageCostStatus.success,
        costs: costs,
      ),
    );
  }).onError((e, s) {
    emit(state.copyWith(status: ManageCostStatus.error));
  });
}

字符串

t40tm48m

t40tm48m2#

在你的cubit类中的getAllCost()函数需要标记为cubit,因为函数调用supabaseRepsitory.getAllCost();,这是一个需要等待的未来,任何时候你调用一个未来的函数,你都必须等待函数and mark your function as async
dart中的future是什么?:* future表示异步操作的结果 *
什么是异步操作?异步操作让程序在等待另一个操作完成的同时完成工作。
以下是一些常见的异步操作:

  • 通过网络获取数据。
  • 写入数据库。
  • 从文件中阅读数据。

这种异步计算通常将其结果作为Future提供,或者如果结果有多个部分,则作为Stream提供。
你可以在这里阅读更多关于blog和await的信息:https://dart.dev/codelabs/async-await

Future<void> getAllCost() async {

    emit(
      state.copyWith(status: ManageCostStatus.loading),
    );

    try {
      late List<Cost> costs = [];
      costs = await supabaseRepsitory.getAllCost();

      emit(state.copyWith(
        status: ManageCostStatus.success,
        costs: costs,
      ));

    } on Exception {
      emit(state.copyWith(status: ManageCostStatus.error));
    }
  }

字符串

相关问题