AFE_USER 2024-09-10 14:18 采纳率: 50%
浏览 3
已结题

渲染数据第二次调用无数据


void openInformation({required String id}) async {
    parseData(id);
    Navigator.push(
      Get.context!,
      popRouteView(
        context: Get.context!,
        child: popView(
          context: Get.context!,
          title: LK.orderInformation.tr,
          width: MediaQuery.of(Get.context!).size.width / 1.2,
          height: MediaQuery.of(Get.context!).size.height / 1.4,
          child: TradeHistoryInfoPage(),
        ),
        popPosition: PopupPosition.center,
      ),
    );
  }

  Future<void> parseData(id) async {
    final result = await UserApi.getSettledTradeView(params: {"id": id});
    if (result.isNotEmpty) {
      state.settleStatus = result['settleStatus'] ?? '';
      state.settleDate = result['settleDate'] ?? '';
      state.tradeDate = result['tradeDate'] ?? '';
      state.ref = result['ref'] ?? '';
      state.contract = result['contract'] ?? '';
      state.exchangeCode = result['exchangeCode'] ?? '';
      state.buySellType = result['buySellType'] ?? '';
      state.avgPrice = result['avgPrice'] ?? '';
      state.totalQty = result['totalQty'] ?? '';
      state.considerAmt = result['considerAmt'] ?? '';
      state.settleAmt = result['settleAmt'] ?? '';
      state.createBy = result['createBy'] ?? '';
      state.createOn = result['createOn'] ?? '';
      state.updateOn = result['updateOn'] ?? '';
      state.updateBy = result['updateBy'] ?? '';
      state.settleCurrCd = result['settleCurrCd'] ?? '';

      for (var element in result['qtys']) {
        loadDataQty(element, true);
      }
      for (var element in result['charges']) {
        loadDataCharge(element, true);
      }
      print('settleDate--------------${state.settleDate}');
    }
    update();
  }
class TradeHistoryInfoPage extends StatelessWidget {
  final TradeHistoryController controller;

  TradeHistoryInfoPage({Key? key})
      : controller = Get.put(TradeHistoryController()),
        super(key: key);

  @override
  Widget build(BuildContext context) {
    return GetBuilder<TradeHistoryController>(
      init: controller,
      global: false,
      builder: (controller) {
        return cardBox(
            context: context,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Expanded(
                  child: _information(context),
                ),
                _chargeTable(context)
              ],
            ));
      },
    );
  }

  Widget _information(BuildContext context) {
    print('settledate--------------${controller.state.settleDate}');
    return Row(
      children: [
        Expanded(
          child: Column(
            children: [
              _buildItem(context, LK.tradeHistorySettleStatus.tr,
                  ': ${MapUtil.getLocalNameByType(CodeType.settledTradeStatus, controller.state.settleStatus)}'),
              _buildItem(context, LK.tradeHistorySettleDate.tr,
                  ': ${controller.state.settleDate}'),
              _buildItem(context, LK.tradeHistoryTradeDate.tr,
                  ': ${controller.state.tradeDate}'),
              _buildItem(
                  context, LK.tradeHistoryRef.tr, ': ${controller.state.ref}'),
              _buildItem(context, LK.tradeHistoryContract.tr,
                  ': ${controller.state.contract}'),
              _buildItem(context, LK.tradeHistoryExchangeCode.tr,
                  ': ${controller.state.exchangeCode}'),
              _buildItem(context, LK.tradeHistoryBuySellType.tr,
                  ': ${controller.state.buySellType}'),
              _buildItem(context, LK.tradeHistoryAvgPrice.tr,
                  ': ${controller.state.avgPrice}'),
              _buildItem(context, LK.tradeHistoryTotalQty.tr,
                  ': ${controller.state.totalQty}'),
              _buildItem(context, LK.tradeHistoryConsiderAmt.tr,
                  ': ${controller.state.considerAmt}'),
              _buildItem(context, LK.tradeHistorySettleAmt.tr,
                  ': ${controller.state.settleAmt}'),
              _buildItem(context, LK.clientCreateBy.tr,
                  ': ${controller.state.createBy}'),
              _buildItem(context, LK.clientCreateOn.tr,
                  ': ${controller.state.createOn}'),
              _buildItem(context, LK.clientUpdateBy.tr,
                  ': ${controller.state.updateBy}'),
              _buildItem(context, LK.clientUpdateOn.tr,
                  ': ${controller.state.updateOn}'),
              _buildItem(context, LK.tradeHistorySettleCurrencyCode.tr,
                  ': ${controller.state.settleCurrCd}'),
            ],
          ),
        ),
        _qtyTable(context),
      ],
    );
  }

  Widget _qtyTable(BuildContext context) {
    return Expanded(
      child: plutoTable(
        context: context,
        keyStr: 'qtys',
        columns: controller.state.qtyColumns,
        rows: controller.state.qtyRows,
        onLoaded: controller.initQTYStateManager,
      ),
    );
  }

  Widget _buildItem(BuildContext context, String label, String value) {
    return Row(
      children: [
        subtext(context: context, name: label),
        text(context: context, name: value),
      ],
    );
  }

  Widget _chargeTable(BuildContext context) {
    return Expanded(
      child: Padding(
        padding: const EdgeInsets.only(top: Dimens.d8),
        child: plutoTable(
          context: context,
          keyStr: 'charge',
          columns: controller.state.chargesColumns,
          rows: controller.state.chargesRows,
          onLoaded: controller.chargeStateManager,
        ),
      ),
    );
  }
}

为什么只有第一次调用openInformation,TradeHistoryInfoPage有数据,第二次调用openInformation,在controller里打印依然还是有数据的,但是TradeHistoryInfoPage里就没有数据了

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-10 17:32
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从您提供的代码片段来看,数据加载和数据更新的逻辑在您的应用中是按照期望运行的。parseData 函数解析API响应并将结果更新到状态中,update() 方法通常用于更新视图和重新渲染。但是在您提到的情况下,首次调用 openInformation 页面数据正确显示,而第二次调用时没有数据显示,可能的原因包括以下几点:

    1. 状态管理问题:确保 update() 方法在数据更新后正确触发。如果状态更新没有触发视图更新,这可能是由于某种原因导致的(如状态没有被正确地修改)。
    2. 页面重建问题:如果您快速连续点击打开信息的按钮,可能导致页面被重建,但在重建过程中可能发生了某些异常或状态重置的情况。检查 Navigator.push 是否正确地保留了页面的状态。在 Flutter 中,如果页面被销毁并重新创建,状态将被重置。这可能是您遇到的问题。您可以尝试使用 GetBuilder 时不添加 global: false,确保控制器在每次构建时保持不变。同时确保每次 openInformation 被调用时都在同一控制器实例上进行操作。此外,使用 Flutter 的调试工具可以帮助检查页面生命周期和状态管理情况。
    3. 异步数据处理问题:如果数据加载过程存在异步延迟(例如网络请求),那么在数据加载完成之前页面可能已重新渲染。这种情况下确保在页面渲染之前获取所有数据是很重要的。如果 parseData 方法中有网络请求或其他异步操作,您需要确保这些数据被正确处理并在页面渲染前更新状态。
    4. 打印和日志问题:虽然您在代码中添加了打印语句来检查状态值,但请确保这些打印语句在预期的时间点执行(例如,在数据加载和页面渲染之后)。此外,查看日志输出以确认是否有任何异常或错误消息,这些可能提供有关问题的线索。

    解决这类问题通常需要逐步调试和对应用程序的深入了解。尝试重新审查代码逻辑,特别是涉及状态管理和页面重建的部分,并确保所有异步操作都正确完成并更新了状态。此外,使用 Flutter 的调试工具可以帮助您更好地理解应用程序的状态和行为。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月10日
  • 创建了问题 9月10日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?