gpt4 book ai didi

dart - Flutter Reloading List with Streams & RxDart

转载 作者:IT老高 更新时间:2023-10-28 12:37:38 28 4
gpt4 key购买 nike

我有一个关于如何在 Flutter 中使用 Streams 和 RxDart 调用刷新指示器后重新加载列表的问题。

这是我的模型类:

    class HomeState {

List<Event> result;
final bool hasError;
final bool isLoading;

HomeState({
this.result,
this.hasError = false,
this.isLoading = false,
});

factory HomeState.initial() =>
new HomeState(result: new List<Event>());
factory HomeState.loading() => new HomeState(isLoading: true);
factory HomeState.error() => new HomeState(hasError: true);

}


class HomeBloc {

Stream<HomeState> state;
final EventRepository repository;

HomeBloc(this.repository) {
state = new Observable.just(new HomeState.initial());
}

void loadEvents(){
state = new Observable.fromFuture(repository.getEventList(1)).map<HomeState>((List<Event> list){
return new HomeState(
result: list,
isLoading: false
);
}).onErrorReturn(new HomeState.error())
.startWith(new HomeState.loading());
}

}

我的小部件:

    class HomePageRx extends StatefulWidget {
@override
_HomePageRxState createState() => _HomePageRxState();
}

class _HomePageRxState extends State<HomePageRx> {
HomeBloc bloc;

_HomePageRxState() {
bloc = new HomeBloc(new EventRest());
bloc.loadEvents();
}

Future<Null> _onRefresh() async {
bloc.loadEvents();
return null;
}

@override
Widget build(BuildContext context) {
return new StreamBuilder(
stream: bloc.state,
builder: (BuildContext context, AsyncSnapshot<HomeState> snapshot) {
var state = snapshot.data;
return new Scaffold(
body: new RefreshIndicator(
onRefresh: _onRefresh,
child: new LayoutBuilder(builder:
(BuildContext context, BoxConstraints boxConstraints) {
if (state.isLoading) {
return new Center(
child: new CircularProgressIndicator(
backgroundColor: Colors.deepOrangeAccent,
strokeWidth: 5.0,
),
);
} else {
if (state.result.length > 0) {
return new ListView.builder(
itemCount: snapshot.data.result.length,
itemBuilder: (BuildContext context, int index) {
return new Text(snapshot.data.result[index].title);
});
} else {
return new Center(
child: new Text("Empty data"),
);
}
}
}),
),
);
});
}
}

问题是当我从列表中进行拉刷新时,UI 没有刷新(服务器被调用,refreshindicator 的动画也是),我知道问题与流有关,但我不知道如何解决它。

预期结果:显示 CircularProgressIndicator 直到数据加载

有什么帮助吗?谢谢

最佳答案

您不应该更改 state 的实例。

您应该向 observable 提交一个新值。这样,正在监听 stateStreamBuilder 将收到新值的通知。

这意味着你不能只在内部拥有一个 Observable 实例,因为 Observable 没有任何添加推送新值的方法。所以你需要一个Subject

基本上这会将您的 Bloc 更改为以下内容:

class HomeBloc {
final Stream<HomeState> state;
final EventRepository repository;
final Subject<HomeState> _stateSubject;

factory HomeBloc(EventRepository respository) {
final subject = new BehaviorSubject(seedValue: new HomeState.initial());
return new HomeBloc._(
repository: respository,
stateSubject: subject,
state: subject.asBroadcastStream());
}

HomeBloc._({this.state, Subject<HomeState> stateSubject, this.repository})
: _stateSubject = stateSubject;

Future<void> loadEvents() async {
_stateSubject.add(new HomeState.loading());

try {
final list = await repository.getEventList(1);
_stateSubject.add(new HomeState(result: list, isLoading: false));
} catch (err) {
_stateSubject.addError(err);
}
}
}

另外,请注意 loadEvent 如何使用 addError 异常。而不是使用 hasError: true 推送 HomeState

关于dart - Flutter Reloading List with Streams & RxDart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50934582/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com