Dart/Flutter - 回调函数的收益

Posted

技术标签:

【中文标题】Dart/Flutter - 回调函数的收益【英文标题】:Dart/Flutter - yield from callback function 【发布时间】:2019-11-28 02:10:53 【问题描述】:

我需要进行一个不返回任何内容的函数调用 (void)。获得函数完成通知的唯一方法是发送 callback 函数。 现在我使用BLoC 模式和ReDux,当一个事件被调度时,我调度另一个动作来存储redux,在action 完成后它调用callback 函数。现在在callback 函数内部,我想更新blocstate。下面是我的实现,

if (event is Login) 
  yield currentState.copyWith(formProcessing: true);
  store.dispatch(authActions.login(
    currentState.username,
    currentState.password,
    (error, data) 
      print(error);
      print(data);
      // I want to yield here.
      yield currentState.copyWith(formProcessing: false);
    ,
  ));

如上面代码sn-p所示,在回调函数里面,我要yield

解决方案

创建一个返回未来的函数,并制作回调函数来存储调度,这里是示例。

if (event is Login) 
  yield currentState.copyWith(formProcessing: true);

  try 
    dynamic result = await loginAction(store, currentState.username, currentState.password);
    print(result);
    yield currentState.copyWith(formProcessing: false);
   catch (e) 
    print(e);
  


Future loginAction(store, username, password) 
  var completer = new Completer();

  store.dispatch(authActions.login(
    username,
    password,
    (error, data) 
      if (error != null) 
        completer.completeError(error);
       else if (data != null) 
        completer.complete(data);
      
    ,
  ));

  return completer.future;

【问题讨论】:

【参考方案1】:

你需要在你的callback函数中创建其他eventdispatch这个event,然后你可以在过滤你的events的函数中做你想做的事情。

我不知道你的 BLoC 的用途是什么,但是这个 event 的名称取决于用例,它可以是 UpdateFormUpdateStateLoggedInLoggedOut 等. 您会找到最适合您的用例的名称。

请记住,您也可以根据您的条件创建带有参数的event,例如UpdateForm (bool isLoggedIn)yield不同的states

例如,这个event的名字是OtherEvent

if (event is Login) 
  yield currentState.copyWith(formProcessing: true);
  store.dispatch(authActions.login(
    currentState.username,
    currentState.password,
    (error, data) 
      print(error);
      print(data);

      dispatch(OtherEvent());
    ,
  ));
 else if (event is OtherEvent) 
   // You can yield here what you want
   yield currentState.copyWith(formProcessing: false);


【讨论】:

这是一个很好的解决方案,我通过包装我的 store.dispatch 函数解决了这个问题,该函数返回了一个 Future,然后等待那个未来我能够屈服。 在flutter_bloc v1.0.0 或更高版本中,您应该使用add() 方法而不是dispatch() 方法。

以上是关于Dart/Flutter - 回调函数的收益的主要内容,如果未能解决你的问题,请参考以下文章

Dart/Flutter ffi(外部函数接口)本机回调,例如:sqlite3_exec

颤振/飞镖:如何在飞镖 FFI 中使用异步回调?

设计一个函数,它接受不定数量的参数,这是参数都是函数。这些函数都接受一个回调函数作为参数,按照回调函数被调用的顺序返回函数名

js中的回调函数

前端(十三)—— JavaScript高级:回调函数闭包循环绑定面向对象定时器

回调函数详解