大佬教程收集整理的这篇文章主要介绍了使用 Flutter 中的 get_it 包导航出屏幕和返回时,StreamBuilder 不会接收流中的数据,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试使用 get_it 和流实现的目标是用户能够扫描条形码,然后将条形码添加到流中。离开扫描屏幕后,流中的项目可以通过流构建器看到,但是当我退出 vIEwResults 屏幕并重新输入时,只显示加载指示符,而看不到流中的数据。
我在查看结果时手动将 2 项数据添加到流中,然后用户可以扫描条形码并且应用导航回 vIEwResults 屏幕,这确实显示添加到流中的数据,但是一旦我去回到首页再次打开 vewResults 页面,加载指示器继续显示,直到我重置LazySingleton() 并返回后才看到数据,然后只显示2个手动添加的条形码。
@H_427_2@main.dart 代码:final GetIt locator = GetIt.I;
voID setupLocator() {
locator.registerLazySingleton<StreamData>(() => StreamData());
}
查看模型代码:
class StreamData {
final StreamController<List<ScansData>> _scanModel = StreamController.broadcast(); // privated
Stream<List<ScansData>> get outScanList => _scanModel.stream;
Sink<List<ScansData>> get _inScanList => _scanModel.sink; // privated
List<ScansData> _barcodeData = [];
StreamData() {
outScanList.Listen((data) { _barcodeData = data; },onError: (E) { print(E); }
);
Future.delayed(const Duration(seconds: 1)).then((_) {
_inScanList.add([
ScansData(
count: 0,barcode: 'Test',date: datetiR_605_11845@e.Now()
),ScansData(
count: 1,]);
});
}
voID addbarcodeScans(ScansData scanData) { // function to add data to the stream
_barcodeData.add(scanData);
Future.delayed(const Duration(seconds: 0)).then((_) {
_inScanList.add(_barcodeData);
}); // doesnt work without future.delay somehow
}
}
将扫描添加到流的扫描仪:
StreamData get _vm => GetIt.I<StreamData>(); // at top of page
//once scan is done:
return showDialog(
context: context,builder: (BuildContext context) {
return AlertDialog(
title: const Text('Scan Again?'),content: Text('Result: ${scanData.codE}'),actions: [
// ignore: deprecated_member_use
Flatbutton(
child: const Text('Retry'),onpressed: () {
setState(() => this.barcode = null);
controller.resumeCamera();
Navigator.of(context).pop();
} ),// ignore: deprecated_member_use
Flatbutton(
child: const Text('ConTinue'),onpressed: () {
controller.stopCamera();
final addToStream = ScansData(
count: 3,barcode: barcodeData,date: datetiR_605_11845@e.Now(),);
_vm.addbarcodeScans(addToStream); // added here
Navigator.of(context).push(MaterialPageRoute(builder: (_) => ScAnnerResultstest()));
setState(() => this.barcode = null);
},)
],);
}
);
查看结果屏幕:
StreamData get _vm => GetIt.I<StreamData>(); // top of page
// stream builder to show data:
padding(
padding: const EdgeInsets.only(top: 300),child: StreamBuilder<List<ScansData>>(
stream: _vm.outScanList,builder: (context,snapshot){
if (!snapshot.hasData){
return const center(child: CircularProgressInDicator());
}
final barcodeData = snapshot.data;
return ListVIEw.builder(
itemCount: barcodeData.length,itemBuilder: (BuildContext context,int indeX){
final dataRx = barcodeData[index];
return padding(
padding: const EdgeInsets.only(left: 10,right: 10,top: 5,bottom: 5),child: Container(
padding: const EdgeInsets.all(10),child: column(
crossAxisAlignment: CrossAxisAlignment.start,children: [
Text('barCODE: ${dataRx.barcodE}',style: _textbar),const SizedBox(height: 2),Text('#${dataRx.count}\t-\t${formatDate(dataRx.datE)}',style: TextStyle(color: ember0B,FontWeight: FontWeight.bold,FontSize: 16),),],decoration: const Boxdecoration(
color: color.fromrGBO(207,244,210,0.75),borderRadius: borderRadius.all(Radius.circular(12.0)),);
}
);
}
),)
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
以上是大佬教程为你收集整理的使用 Flutter 中的 get_it 包导航出屏幕和返回时,StreamBuilder 不会接收流中的数据全部内容,希望文章能够帮你解决使用 Flutter 中的 get_it 包导航出屏幕和返回时,StreamBuilder 不会接收流中的数据所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。