在我的Flutter项目中,为了提高性能,我创建了许多const
小部件,这些小部件在其父小部件重建时将不会重建。
但是在用户更改应用程序的语言之后,我需要重建整个应用程序以应用文本更改。
是否有一种方法可以强制应用完全重建?谢谢,任何建议将不胜感激。
答案 0 :(得分:2)
'Inheritedwidget`是在传递的值更改时重绘任何小部件的解决方案。甚至是无状态和const小部件。
例如,对于翻译,flutter已经提供了InheritedWidget,您可以使用Localizations.of
方法将其绑定到
答案 1 :(得分:1)
是的,有一种方法可以做到。您必须在代码中执行完全重启(现在称为热重启),这样做的方法是将您的应用放入静态小部件(为什么是静态的?),因为它将被创建一次只是为了避免null或类似的东西那)。当您想完全重启时,只需在该小部件中执行热重加载,然后它将重新启动您的应用即可。您可以在任何地方使用
这是方法:
1-首先进入main.dart,将您的App放入Restart小部件中:
import 'package:flutter/material.dart';
import 'home.dart';
void main() {
runApp(new HotRestartController(
child: new MyApp()
));
}
2-将您的hotRestartController写入文件内:
class HotRestartController extends StatefulWidget {
final Widget child;
HotRestartController({this.child});
static performHotRestart(BuildContext context) {
final _HotRestartControllerState state = context.ancestorStateOfType(const TypeMatcher<_HotRestartControllerState>());
state.performHotRestart();
}
@override
_HotRestartControllerState createState() => new _HotRestartControllerState();
}
class _HotRestartControllerState extends State<HotRestartController> {
Key key = new UniqueKey();
void performHotRestart() {
this.setState(() {
key = new UniqueKey();
});
}
@override
Widget build(BuildContext context) {
return new Container(
key: key,
child: widget.child,
);
}
}
3-随时随地可以导入main.dart,并使用以下命令调用“ performHotRestart”:
HotRestartController.restartApp(context)
玩得开心!