gpt4 book ai didi

flutter - 在Flutter中,如何解决 `AnimatedCrossFade`低效设计?

转载 作者:IT王子 更新时间:2023-10-29 06:33:58 25 4
gpt4 key购买 nike

AnimatedCrossFade 的一个问题是您必须提供两个子项,即使只显示其中一个。

如果这些 child 中的一个(或两个)复杂且沉重,则效率不高。

我小时候曾尝试提供一个 Builder,如下所示:

AnimatedCrossFade(
firstChild: widget1,
secondChild: Builder(builder: widget2builder),
duration: const Duration(milliseconds: 500),
crossFadeState: toggle ? CrossFadeState.showFirst : CrossFadeState.showSecond,
),

var widget2builder = (context) {
print("Building widget 2");
return Container(),
);
};

但是,这会立即打印 Building widget 2,即使第一个小部件是正在显示的小部件,因此根本不需要小部件 2。

这是一个完整的、可运行的例子:

import 'package:flutter/material.dart';

void main() {
runApp(MyApp());
}

class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
bool toggle;

@override
void initState() {
super.initState();
toggle = true;
}

@override
Widget build(BuildContext context) {
var toggleButton = Padding(
padding: const EdgeInsets.all(8.0),
child: MaterialButton(
child: const Text("Toggle"),
color: Colors.grey,
onPressed: () {
setState(() {
toggle = !toggle;
});
},
),
);

var widget1 = Container(
key: UniqueKey(),
color: Colors.blue,
width: 200.0,
child: const Text(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt "
"ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation "
"ullamco laboris nisi ut aliquip ex ea commodo consequat.",
),
);

var widget2builder = (context) {
print("Building widget 2.");
return Container(
key: UniqueKey(),
color: Colors.red,
width: 200.0,
child: const Text(
"I am ready for my closeup.",
),
);
};

return MaterialApp(
home: Material(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
toggleButton,
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text("Some text above."),
AnimatedCrossFade(
firstChild: widget1,
secondChild: Builder(builder: widget2builder),
duration: const Duration(milliseconds: 500),
crossFadeState: toggle ? CrossFadeState.showFirst : CrossFadeState.showSecond,
),
const Text("Some text below."),
],
),
],
),
),
);
}
}

如果运行此程序,您将看到 Building widget 2 被打印到控制台,但显示的是 widget 1。

我的问题:

  • AnimatedCrossFade 构建它不使用的小部件是否有任何原因?

  • 如何防止此问题并有效地使用 AnimatedCrossFade

最佳答案

我想在 Rémi 的回答中补充一点,在问完这个问题后,我发布了一个包来解决它,名为 AnimatedSizeAndFade:

https://pub.dev/packages/animated_size_and_fade

它与其他类似小部件相比如何:

  • 对于 AnimatedCrossFade,您必须保留 firstChild 和 secondChild,而对于 AnimatedSizeAndFade 则不需要。

  • 使用 AnimatedSwitcher,您可以简单地更改其子级,但随后它只会为淡入淡出设置动画,而不是大小。

  • 除非您事先知道子项的大小,否则 AnimatedContainer 也不起作用。

关于flutter - 在Flutter中,如何解决 `AnimatedCrossFade`低效设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51738203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com