"Looking up a deactivated widget's ancestor is unsafe." 有状态小部件
"Looking up a deactivated widget's ancestor is unsafe." with StatefullWidget
我找不到我的问题的任何答案。在下面的代码中,如果我使用带有“图像”的“GestureDetector”而不是带有 PhotoView 的 Dismissible,一切都是完美的。当我 运行 它时,它抛出“祖先不安全”错误。
我的代码 ID 用于显示漫画的页面。代码行“comic.paginaActual(comic.readProgress.page)” returns 带有漫画页面的 NetworkImage。当用户“关闭”页面(使用可关闭小部件)时,应用会加载下一页(至少是预期结果)。
正如我所说,我已经尝试过使用手势检测器(使用水平手势进行滑动)并且只使用“图像”而不是 Photoview,它运行完美,但是当我使用 Dismissible 时,应用程序崩溃了。
这是代码:
// ignore: use_key_in_widget_constructors
class PaginaFull extends StatefulWidget {
@override
State<PaginaFull> createState() => _PaginaFullState();
}
class _PaginaFullState extends State<PaginaFull> {
late PhotoViewScaleStateController scaleController;
DismissDirection dismissDirection = DismissDirection.horizontal;
@override
void didChangeDependencies() {
_enterFullscreen();
scaleController = PhotoViewScaleStateController();
super.didChangeDependencies();
}
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
_exitFullscreen();
scaleController.dispose();
}
_enterFullscreen() async {
await FullScreen.enterFullScreen(FullScreenMode.EMERSIVE);
}
_exitFullscreen() async {
await FullScreen.exitFullScreen();
}
void paginaSiguiente({required Comic comic}) {
if (comic.readProgress.page < (comic.media.pagesCount)) {
setState(() {
comic.readProgress.page += 1;
});
}
}
void paginaAnterior({required Comic comic}) {
if (comic.readProgress.page > 1) {
setState(() {
comic.readProgress.page -= 1;
});
}
}
@override
Widget build(BuildContext context) {
final Comic comic = ModalRoute.of(context)!.settings.arguments as Comic;
return Scaffold(
appBar: null,
body: Builder(builder: (context) {
return AnimatedSwitcher(
duration: const Duration(milliseconds: 300),
child: Dismissible(
behavior: HitTestBehavior.translucent,
key: Key(comic.readProgress.page.toString()),
direction: dismissDirection,
onDismissed: (DismissDirection direction) {
if (direction == DismissDirection.startToEnd) {
paginaAnterior(comic: comic);
} else {
paginaSiguiente(comic: comic);
}
},
resizeDuration: null,
child: PhotoView(
scaleStateController: scaleController,
filterQuality: FilterQuality.high,
initialScale: PhotoViewComputedScale.contained,
minScale: PhotoViewComputedScale.contained,
gaplessPlayback: true,
enableRotation: false,
imageProvider: comic.paginaActual(comic.readProgress.page),
),
),
);
}),
);
}
}
也许会改变其他小部件的体验....但我是 flutter 的新手,我现在不知道我还能使用什么。
提前感谢您的帮助!...来自智利!
已解决!!!
问题来自 photo_view 包。
在 pubspec.yaml 中从依赖关系中删除 photo_view
依赖项:
photo_view:^0.13.0
添加:
dependency_overrides:
photo_view:
git:
url: https://github.com/bluefireteam/photo_view
参考:大师
这样就避免了问题!!!
我找不到我的问题的任何答案。在下面的代码中,如果我使用带有“图像”的“GestureDetector”而不是带有 PhotoView 的 Dismissible,一切都是完美的。当我 运行 它时,它抛出“祖先不安全”错误。
我的代码 ID 用于显示漫画的页面。代码行“comic.paginaActual(comic.readProgress.page)” returns 带有漫画页面的 NetworkImage。当用户“关闭”页面(使用可关闭小部件)时,应用会加载下一页(至少是预期结果)。
正如我所说,我已经尝试过使用手势检测器(使用水平手势进行滑动)并且只使用“图像”而不是 Photoview,它运行完美,但是当我使用 Dismissible 时,应用程序崩溃了。
这是代码:
// ignore: use_key_in_widget_constructors
class PaginaFull extends StatefulWidget {
@override
State<PaginaFull> createState() => _PaginaFullState();
}
class _PaginaFullState extends State<PaginaFull> {
late PhotoViewScaleStateController scaleController;
DismissDirection dismissDirection = DismissDirection.horizontal;
@override
void didChangeDependencies() {
_enterFullscreen();
scaleController = PhotoViewScaleStateController();
super.didChangeDependencies();
}
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
_exitFullscreen();
scaleController.dispose();
}
_enterFullscreen() async {
await FullScreen.enterFullScreen(FullScreenMode.EMERSIVE);
}
_exitFullscreen() async {
await FullScreen.exitFullScreen();
}
void paginaSiguiente({required Comic comic}) {
if (comic.readProgress.page < (comic.media.pagesCount)) {
setState(() {
comic.readProgress.page += 1;
});
}
}
void paginaAnterior({required Comic comic}) {
if (comic.readProgress.page > 1) {
setState(() {
comic.readProgress.page -= 1;
});
}
}
@override
Widget build(BuildContext context) {
final Comic comic = ModalRoute.of(context)!.settings.arguments as Comic;
return Scaffold(
appBar: null,
body: Builder(builder: (context) {
return AnimatedSwitcher(
duration: const Duration(milliseconds: 300),
child: Dismissible(
behavior: HitTestBehavior.translucent,
key: Key(comic.readProgress.page.toString()),
direction: dismissDirection,
onDismissed: (DismissDirection direction) {
if (direction == DismissDirection.startToEnd) {
paginaAnterior(comic: comic);
} else {
paginaSiguiente(comic: comic);
}
},
resizeDuration: null,
child: PhotoView(
scaleStateController: scaleController,
filterQuality: FilterQuality.high,
initialScale: PhotoViewComputedScale.contained,
minScale: PhotoViewComputedScale.contained,
gaplessPlayback: true,
enableRotation: false,
imageProvider: comic.paginaActual(comic.readProgress.page),
),
),
);
}),
);
}
}
也许会改变其他小部件的体验....但我是 flutter 的新手,我现在不知道我还能使用什么。
提前感谢您的帮助!...来自智利!
已解决!!!
问题来自 photo_view 包。
在 pubspec.yaml 中从依赖关系中删除 photo_view
依赖项: photo_view:^0.13.0 添加:
dependency_overrides: photo_view: git: url: https://github.com/bluefireteam/photo_view 参考:大师
这样就避免了问题!!!