StreamBuilder 的简单封装,用于选择性地重建,优化组件的重建操作。
用法
StreamBuilderX
StreamBuilder 封装,增加了选择性确定是否重建的能力。
class StreamBuilderWidget extends StatelessWidget {
const StreamBuilderWidget({Key? key, required this.controller})
: super(key: key);
final StreamController<StreamState> controller;
@override
Widget build(BuildContext context) {
return StreamBuilderX<StreamState>(
stream: controller.stream,
asyncBuildWhen: (prev, curr) {
return curr.data?.number != curr.data?.number;
},
builder: (context, snapshot) {
debugPrint("built StreamBuilderWidget");
final state = snapshot.data;
return Text('${state?.text}/${state?.number}');
},
);
}
}
StreamSelectorX
StreamBuilder 封装,增加了选择性确定是否重建的能力。
class StreamSelectorWidget extends StatelessWidget {
const StreamSelectorWidget({Key? key, required this.controller})
: super(key: key);
final StreamController<StreamState> controller;
@override
Widget build(BuildContext context) {
return StreamSelectorX<StreamState, int?>(
stream: controller.stream,
asyncSelector: (snapshot) {
return snapshot.data?.number;
},
builder: (context, snapshot) {
debugPrint("built StreamSelectorWidget");
return ElevatedButton(
onPressed: () {
if (snapshot.data == null) {
controller.add(const StreamState(text: '', number: 0));
} else {
final data = snapshot.data!;
controller.add(data.copyWith(number: data.number + 1));
}
},
child: Text(snapshot.data?.number.toString() ?? 0.toString()));
},
);
}
}
StreamListenerX
当流发出新值时运行回调,而不重建子组件。
class StreamListenerWidget extends StatelessWidget {
const StreamListenerWidget({Key? key, required this.controller})
: super(key: key);
final StreamController<StreamState> controller;
@override
Widget build(BuildContext context) {
return StreamListenerX<StreamState>(
stream: controller.stream,
onData: (data) {
debugPrint("onData");
},
child: const Text("This will not change"),
);
}
}