【问题标题】:error with PhotoView : Looking up a deactivated widget's ancestor is unsafePhotoView 错误:查找已停用小部件的祖先是不安全的
【发布时间】:2022-06-26 03:11:13
【问题描述】:

我已经阅读了几篇关于“查找已停用的小部件的祖先是不安全的”错误的 stackoverflow 帖子,但找不到有效的答案。

我尝试使用脚手架设置全局键,并使用 WidgetsBinding.instance.addPostFrameCallback() 失败。

我很确定我在做一些愚蠢且易于修复的事情,但我不知道是什么。

这是一个简单版本的代码,当您从 PhotoViewPage (photo_view package) 返回时复制错误:

my_home_page.dart

import 'package:flutter/material.dart';
import 'package:phototest/photo_view_page.dart';


class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return TextButton(
      child: const Text("to PhotoView"),
      onPressed: () => _toPhotoView(context),
    );
  }

  void _toPhotoView(BuildContext context) {
    Navigator.of(context).push(
      MaterialPageRoute<dynamic>(
        builder: (BuildContext context) => const PhotoViewPage(),
      ),
    );
  }
}

photo_view_page.dart

import 'package:flutter/material.dart';
import 'package:photo_view/photo_view.dart';

class PhotoViewPage extends StatelessWidget {
  const PhotoViewPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return PhotoView(imageProvider: AssetImage("assets/image.png"));
  }
}

【问题讨论】:

  • 您是否尝试过推送 PhotoView 以外的其他路由?
  • 同样的问题。
  • 我在升级到 Flutter 3 后也遇到了同样的问题。之前,它没有出现这些错误

标签: flutter dart


【解决方案1】:

更新 - 已在 photo_view 0.14 中修复。

问题来自photo_view 包。

pubspec.yaml 中,从 dependecies

中删除 photo_view
dependencies:
  photo_view: ^0.13.0

添加:

dependency_overrides:
  photo_view:
    git:
      url: https://github.com/bluefireteam/photo_view
      ref: master

这样您将避免来自同一版本的依赖项中的错误。

【讨论】:

  • 有一些包依赖于此,并且有同样的问题,由于版本依赖,用户无法临时修复。
  • 虽然我这样做了,但我仍然收到此错误。
  • 其他包可能会抛出相同的错误。你也可以尝试运行flutter clean。
  • 我在升级到 Flutter 3 后遇到了同样的问题。(在早期版本的 Flutter 上它可以正常工作)......在我更换上述解决方案后,它再次工作没有错误......谢谢
【解决方案2】:

我不确定错误来自哪里,但是将颤振通道从 master 切换到 stable 修复了它。

flutter channel stable

flutter upgrade --force

【讨论】:

    【解决方案3】:

    说实话,使用 InteractiveViewer 比使用一些不稳定的库更好

    child: InteractiveViewer(
                    child: Container(
                      height: double.infinity,
                      width: double.infinity,
                      decoration: BoxDecoration(color: Colors.transparent, borderRadius: BorderRadius.circular(0)),
                      child: CachedNetworkImage( imageUrl: image,
                        imageBuilder: (context, imageProvider) => Container(
                          width: double.infinity,
                          height: double.infinity,
                          decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(5) ,
                            image: DecorationImage(
                              image: imageProvider, fit: BoxFit.scaleDown,
                            ),
                          ),
                        ),
                        placeholder: (context, url) => const Center(child: CircularProgressIndicator(color: Colors.black,)),
                        errorWidget: (context, url, error) => const Icon(Icons.error),),
                      margin: const EdgeInsets.symmetric(horizontal: 20),
                    ),
                  ),
    
    

    如果您只需要放大,您将获得相同的效果

    你可以重建和停止使用热重载

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 2020-08-08
      • 2021-11-15
      • 2021-06-03
      • 2020-12-26
      • 2021-07-28
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      相关资源
      最近更新 更多