程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用 Flutter 中的 get_it 包导航出屏幕和返回时,StreamBuilder 不会接收流中的数据大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用 Flutter 中的 get_it 包导航出屏幕和返回时,StreamBuilder 不会接收流中的数据?

开发过程中遇到使用 Flutter 中的 get_it 包导航出屏幕和返回时,StreamBuilder 不会接收流中的数据的问题如何解决?下面主要结合日常开发的经验,给出你关于使用 Flutter 中的 get_it 包导航出屏幕和返回时,StreamBuilder 不会接收流中的数据的解决方法建议,希望对你解决使用 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,请注明来意。