【问题标题】:What is the difference between runApp(new MyApp()) and runApp(new MaterialApp()) in flutter?Flutter 中的 runApp(new MyApp()) 和 runApp(new MaterialApp()) 有什么区别?
【发布时间】:2018-12-21 02:38:27
【问题描述】:

在 Flutter 中,我们可以传递一个无状态小部件,该小部件返回一个 MaterialApp 实例给 runApp() 函数,如下所示:

void main()=>runApp(new MyApp());

class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return new MaterialApp(
            ...
        );
    }
}

或者我们可以像这样将MaterialApp 的实例直接传递给runApp() 函数:

void main()=>runApp(
    new MaterialApp(
       ...
    );
);

这些to方式有什么区别?谢谢。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    视觉行为没有区别。 改变的是热重载的行为方式。

    例如,如果您使用runApp(MaterialApp()),则从

    runApp(MaterialApp(title: 'Foo'))
    

    runApp(MaterialApp(title: 'Bar'))
    

    那么热重载不会考虑更改。

    如果你有以下课程:

    class MyApp {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Foo',
        );
      )
    }
    

    并像这样使用它:

    runApp(MyApp())
    

    然后更改 titleMyApp 将正确地热重载。

    【讨论】:

    • 是的。由于build() 方法,这是有道理的谢谢。
    • 不,这是因为热重载不再运行main。它只需编辑修改后的类并使用新代码刷新屏幕。但最后,runApp 并没有被新的 props 再次调用。
    【解决方案2】:

    为了使热重载能够保持状态,它会应用代码更改并重新运行build() 以便更新视图。如果重新启动整个应用程序,则先前的状态将丢失。这是不希望的。如果您希望这样做,请改用热重启

    这也意味着仅在整个应用程序重新启动时才执行的代码更改不会应用于当前状态。

    有关热重载和限制的更多详细信息,请参阅https://flutter.io/docs/development/tools/hot-reload

    要在热重载时添加自定义行为,方法 State<T>.reassemble 可以被覆盖 https://docs.flutter.io/flutter/widgets/State/reassemble.html

    【讨论】:

      【解决方案3】:

      在一种情况下,您有一个类,您可以向其中添加更多方法并使用它们。在一种情况下你没有。

      【讨论】:

      • 虽然这对于生产模式是正确的,但真正的目的是用于开发(热重载)
      猜你喜欢
      • 2020-07-28
      • 2020-03-12
      • 2018-08-02
      • 2011-11-22
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      相关资源
      最近更新 更多