在 Flutter 中使用“widget_screenshot”进行大屏幕截图时出错

问题描述 投票:0回答:1

过去我在去年8月成功使用了这个小部件的0.08版本https://pub.dev/packages/widget_screenshot)。我今天克隆了我的存储库。 现在,使用相同的代码(在物理和模拟设备中,版本 0.08 和版本 0.09)使用相同的测试代码生成错误。 此错误仅在大屏幕上出现。我附上了我手机中安装版本的截图

Screenshot 现在出现这个问题

E/flutter (12312): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: 'package:flutter/src/rendering/proxy_box.dart': Failed assertion: line 3356 pos 12: '!debugNeedsPaint': is not true. E/flutter (12312): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61) E/flutter (12312): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5) E/flutter (12312): #2 RenderRepaintBoundary.toImage (package:flutter/src/rendering/proxy_box.dart:3356:12) E/flutter (12312): #3 WidgetShotRenderRepaintBoundary._screenshot (package:widget_screenshot/src/widget_screenshot.dart:212:28) E/flutter (12312): #4 WidgetShotRenderRepaintBoundary.screenshot (package:widget_screenshot/src/widget_screenshot.dart:73:28) E/flutter (12312): #5 HomePageTopAppBar.build.<anonymous closure> (package:tmra/pages/home_page/home_page_widgets.dart:225:54) E/flutter (12312): #6 _InkResponseState.handleTap (package:flutter/src/material/ink_well.dart:1183:21) E/flutter (12312): #7 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:275:24) E/flutter (12312): #8 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:652:11) E/flutter (12312): #9 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:309:5) E/flutter (12312): #10 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:279:7) E/flutter (12312): #11 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:167:27) E/flutter (12312): #12 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:492:20) E/flutter (12312): #13 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:468:22) E/flutter (12312): #14 RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:439:11) E/flutter (12312): #15 GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:413:7) E/flutter (12312): #16 GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:376:5) E/flutter (12312): #17 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:323:7) E/flutter (12312): #18 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:292:9) E/flutter (12312): #19 _invoke1 (dart:ui/hooks.dart:328:13) E/flutter (12312): #20 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:410:7) E/flutter (12312): #21 _dispatchPointerDataPacket (dart:ui/hooks.dart:262:31) E/flutter (12312): D/EGL_emulation(12312): app_time_stats: avg=9620.64ms min=12.61ms max=163282.84ms count=17 D/EGL_emulation(12312): app_time_stats: avg=76.62ms min=11.31ms max=1662.93ms count=29 PS D:\flutter_app\tmra> flutter --version Flutter 3.16.0 • channel stable • https://github.com/flutter/flutter.git Framework • revision db7ef5bf9f (6 weeks ago) • 2023-11-15 11:25:44 -0800 Engine • revision 74d16627b9 Tools • Dart 3.2.0 • DevTools 2.28.2

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:intl/intl.dart';
import 'package:tmra/common.dart';
import 'package:tmra/constants.dart';
import 'package:tmra/models/model_sensors.dart';
import 'package:tmra/models/sensors_type.dart';
import 'package:tmra/pages/download_page/download_page.dart';
import 'package:tmra/pages/home_page/fill_sensors.dart';
import 'package:tmra/services/services_sensors.dart';
import 'package:widget_screenshot/widget_screenshot.dart';
import '../info_page/info_page.dart';
import 'home_page_widgets.dart';

class HomePage extends StatefulWidget {
  const HomePage({Key? key, required this.wifiName, required this.testMode})
      : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
  final String wifiName;
  final bool testMode;
}

class _HomePageState extends State<HomePage> {
  List<SensorType> sensors = [];
  Sensors info = Sensors();
  var services = SensorsTMRAServices();
  String timeStampUtc = '';
  String timeDownload = '';
  late PageController _pageController;

  ///Para captura de pantalla
  GlobalKey headerEMKey = GlobalKey();
  GlobalKey sensorsEMKey = GlobalKey();
  ScrollController scrollController = ScrollController();

  void getSensorInfo() async {
    info = await services.getSensorsValues(widget.testMode);
    sensors = fillSensor(info);

    ///Quitar UTC (+3 horas)
    timeStampUtc = subtractUTC(info.timeStampUtc!, 3);
    timeDownload = subtractUTC(info.timeDownloadUtc!, 3);
    setState(() {});
  }

  @override
  void initState() {
    getSensorInfo();
    _pageController = PageController(viewportFraction: 1, keepPage: true);
    super.initState();
  }

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    double widthScreen = MediaQuery.of(context).size.width;
    return Scaffold(
        backgroundColor: Colors.black,
        extendBody: true,
        body: Stack(
          alignment: Alignment.center,
          children: [
            PageView(
                physics: const BouncingScrollPhysics(),
                controller: _pageController,
                children: [
                  ///Page 1
                  RefreshIndicator(
                      strokeWidth: 3,
                      displacement:
                          MediaQuery.of(context).size.height / 2 - 200,
                      color: Colors.black,
                      backgroundColor: Colors.white,
                      onRefresh: () async {
                        getSensorInfo();
                      },
                      child: sensors.isNotEmpty
                          ? Column(
                              children: [
                                HeaderInfo(
                                    headerEMKey: headerEMKey,
                                    info: info,
                                    widget: widget,
                                    timeDownload: timeDownload,
                                    timeStampUtc: timeStampUtc,
                                    sensors: sensors,
                                    sensorsEMKey: sensorsEMKey,
                                    scrollController: scrollController),
                                Expanded(
                                  child: WidgetShot(
                                      key: sensorsEMKey,
                                      child: EMSensors(
                                        sensors: sensors,
                                        scrollController: scrollController,
                                      )),
                                ),
                              ],
                            )
                          : Stack(
                              children: [
                                const Center(
                                  child: Column(
                                    mainAxisAlignment: MainAxisAlignment.center,
                                    children: [
                                      Text('Espere...',
                                          style: TextStyle(
                                              color: Colors.white,
                                              fontSize: 18)),
                                      SizedBox(height: 20),
                                      CircularProgressIndicator(
                                        color: Colors.white,
                                      ),
                                    ],
                                  ),
                                ),
                                Positioned(
                                  right: 40,
                                  bottom: 40,
                                  child: CircleCustomButton(
                                    sizeButton: 70,
                                    icon: reloadingIcon,
                                    function: () {
                                      getSensorInfo();
                                    },
                                  ),
                                ),
                              ],
                            )),

                  ///Page 2
                  InfoBoards(info: info),

                  ///Page 3
                  DownloadPage(
                    info: info,
                    testMode: widget.testMode,
                  )
                ]),
            if (sensors.isNotEmpty)
              CustomPageView(
                  widthScreen: widthScreen, pageController: _pageController),
          ],
        ));
  }
}

class HeaderInfo extends StatelessWidget {
  const HeaderInfo({
    super.key,
    required this.headerEMKey,
    required this.info,
    required this.widget,
    required this.timeDownload,
    required this.timeStampUtc,
    required this.sensors,
    required this.sensorsEMKey,
    required this.scrollController,
  });

  final GlobalKey<State<StatefulWidget>> headerEMKey;
  final Sensors info;
  final HomePage widget;
  final String timeDownload;
  final String timeStampUtc;
  final List<SensorType> sensors;
  final GlobalKey<State<StatefulWidget>> sensorsEMKey;
  final ScrollController scrollController;

  @override
  Widget build(BuildContext context) {
    return WidgetShot(
      key: headerEMKey,
      child: Padding(
          padding: const EdgeInsets.fromLTRB(kPadding, 50, kPadding, kPadding),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              SizedBox(
                height: 70,
                child: HomePageTopAppBar(
                  info: info,
                  testMode: widget.testMode,
                  timeDownload: timeDownload,
                  timeStampUtc: timeStampUtc,
                  sensors: sensors,
                  headerEMKey: headerEMKey,
                  sensorsEMKey: sensorsEMKey,
                  scrollController: scrollController,
                ),
              ),
              const Divider(
                height: 10,
                color: Colors.white,
              ),
              const SizedBox(height: 10),
              InfoConfig(
                  title: 'Batería: ',
                  value: '${info.tensionDeBateria}V',
                  size: kFontSize,
                  icon: batteryIcon),
              InfoConfig(
                  title: 'Último valor bajado: ',
                  value: '${info.downloadLastAddress!} \n[$timeDownload]',
                  size: kFontSize - 1.5,
                  icon: downloadIcon),
              InfoConfig(
                  title: 'Último valor grabado: ',
                  value: info.logLastAddress!,
                  size: kFontSize,
                  icon: cpuIcon),
              InfoConfig(
                  title: 'Time Stamp: ',
                  value: widget.testMode
                      ? DateFormat(
                              'yyyy/MM/dd HH:mm:ss')
                          .format(DateTime.now())
                      : timeStampUtc,
                  size: kFontSize - 1,
                  icon: clockIcon),
            ],
          )),
    );
  }
}

///Lista de sensores de la EM
class EMSensors extends StatelessWidget {
  const EMSensors({
    super.key,
    required this.sensors,
    required this.scrollController,
  });

  final List<SensorType> sensors;
  final ScrollController scrollController;

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
        controller: scrollController,
        padding: const EdgeInsets.only(
            top: 0, bottom: kPaddingBottomScrollViews, left: 5, right: 5),
        physics: const BouncingScrollPhysics(),
        itemCount: sensors.length,
        itemBuilder: (_, index) {
          return Padding(
            padding: const EdgeInsets.only(bottom: 20),
            child: SensorCard(info: sensors[index], index: index),
          );
        });
  }
}


android flutter screenshot takesscreenshot
1个回答
0
投票

if (headerBoundary.debugNeedsPaint) { await Future.delayed(const Duration(milliseconds: 1000));

© www.soinside.com 2019 - 2024. All rights reserved.