有没有办法重建整个项目,包括flutter项目中的const小部件?

时间:2018-11-23 04:05:29

标签: widget flutter const rebuild

在我的Flutter项目中,为了提高性能,我创建了许多const小部件,这些小部件在其父小部件重建时将不会重建。

但是在用户更改应用程序的语言之后,我需要重建整个应用程序以应用文本更改。

是否有一种方法可以强制应用完全重建?谢谢,任何建议将不胜感激。

2 个答案:

答案 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)

玩得开心!