【问题标题】:Why Root Widget gets build twice?为什么 Root Widget 会构建两次?
【发布时间】:2019-08-26 04:13:20
【问题描述】:

我有这个非常基本的测试应用:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    print("ROOT WIDGET ");
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Container(decoration: BoxDecoration(color: Colors.blue),),
    );
  }
}

日志输出调试:

在 iPhone X 上以调试模式启动 lib/main.dart...

找到保存的证书选项“XXX”。要清除,请使用“flutter config”。 使用开发者身份为设备部署签署 iOS 应用程序:“XXX”

正在运行 Xcode 构建...

Xcode 构建完成。 39,4s

正在安装和启动...

颤动:根小部件

正在将文件同步到设备 iPhone X...

颤动:根小部件

flutter run --release 的日志输出

在 iPhone X 上以发布模式启动 lib/main.dart...

找到保存的证书选项“XXX”。要清除,请使用“flutter config”。

使用开发者身份为设备部署签署 iOS 应用程序:“XXX”

正在运行 pod install...
1,2s

正在运行 Xcode 构建...
├─构建 Dart 代码... 15,8s

├─正在生成dSYM文件... 0,1s

├─剥离调试符号... 0,0s

├─组装Flutter资源... 0,7s

└─编译、链接和签名... 48,3s

Xcode 构建完成。 67.4秒

正在安装和启动...
6.8秒

要退出,请按“q”。

颤动:根小部件

如您所见,它只发生在调试模式下。

我问的原因是,在我的真实应用中,我使用WebViewWebView 的函数onWebViewCreated(WebViewController controller) 只在第一次调用,所以在调试模式下WebViewController 始终为空。

【问题讨论】:

  • 没关系,你不应该为此烦恼。如果它给你带来了问题,那么你很可能在 build 方法中做了一些你不应该做的事情。见stackoverflow.com/questions/52249578/…
  • 感谢您的快速回答,但正如您所见,我在构建方法中基本上没有做任何事情。
  • 哦,我想我明白你的意思了,在另一个应用程序中,我在构建方法中初始化了一个 webView,这可能是我不应该做的事情。但是,我必须在某个地方初始化我的 webView,如果不在 build 方法中。
  • 很可能是这样 :) 你会想在 initState 或类似的中这样做
  • @Alexander Semenov 是的,在这种使用 webview 的特殊情况下,我们只在 initState 方法中对其进行了初始化,并且不再出现问题。

标签: flutter


【解决方案1】:

我也有同样的问题,发现不是flutter的问题,是vscode。 尝试在android studio 中运行。

【讨论】:

  • 它如何帮助解决问题中的环境问题?
  • 我不太清楚,也许我的回答与这个问题无关。但是当我使用 vscode 时,应用程序每次构建两次。它不会发生在 android studio
【解决方案2】:

线索可能就在这里

Installing and launching... //We are launching the app , the code bundled with it it's executed briefly before it "sync" to allow hot reload

flutter: ROOT WIDGET //The bundled code executes

Syncing files to device iPhone X... //We start the sync, hot reload triggers an app rebuild 

flutter: ROOT WIDGET //The live code executes

如果您评论打印,然后热重新加载,然后取消评论打印,您应该只会看到一个“ROOT WIDGET”。

【讨论】:

    【解决方案3】:

    我一直在处理这个问题

    Flutter 1.22.0 • 通道稳定

    从我的模拟器/实体手机中删除该应用并重新安装可解决此问题。从系统设置/应用程序中删除模拟器/物理应用程序并在调试模式下重新安装。

    我不知道为什么,但有时我的主小部件会不断地重建两次,而且我在主小部件中没有做任何事情,没有 SetStates 或没有 futurebuilder。我认为这是一个颤振内部错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 2015-08-18
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多