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
函数内部,我想更新bloc
的state
。下面是我的实现,
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
函数中创建其他event
和dispatch
这个event
,然后你可以在过滤你的events
的函数中做你想做的事情。
我不知道你的 BLoC 的用途是什么,但是这个 event
的名称取决于用例,它可以是 UpdateForm
、UpdateState
、LoggedIn
、LoggedOut
等. 您会找到最适合您的用例的名称。
请记住,您也可以根据您的条件创建带有参数的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
设计一个函数,它接受不定数量的参数,这是参数都是函数。这些函数都接受一个回调函数作为参数,按照回调函数被调用的顺序返回函数名