Flutter 热重载在 android studio(mac) 中不起作用

jit*_*555 22 android ios android-studio flutter

在 mac 机器上工作时,我发现热重载在 Android Studio 中不起作用。我不知道怎么了:)

这是不重新加载的代码(我将Hello world文本更改为Flutter 示例文本)

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new Scaffold(
      appBar: new AppBar(
        title: new Text("Demo Project"),
      ),
      body: Center(child: new Text("Hello World!!!")),
    ),
  ));
}
Run Code Online (Sandbox Code Playgroud)

请通过以下链接查看以下视频 https://www.dropbox.com/s/e7viujcgv8w0mtr/hot_reload.mp4?dl=0

这不会阻止我的发展,但我担心它为什么会发生。

Inv*_*vin 42

Flutter 文档说“热重载将代码更改加载到 VM 中并重新构建小部件树,保留应用程序状态;它不会重新运行 main () 或initState ()”

因此,看起来如果应用程序逻辑驻留在main 方法之外,那么热重载就可以工作。尝试像下面这样重构您的应用程序,然后重新启动(绿色按钮)。您所做的任何后续更改,将在保存时热重载

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("Demo Project"),
        ),
        body: Center(child: new Text("Hello World!!!")),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:如果您要添加新资产(如图像或媒体文件),则热重载将不起作用。在这些情况下,您必须重新启动应用程序。


vis*_*hwa 20

尝试这个

GitHub 上的解决方案Reloaded 0 of NNN libraries in Xms

Android Studio使用IDEA自动导入文件,像这样

import 'file///F:/flutter_project/lib/home_page.dart';
Run Code Online (Sandbox Code Playgroud)

将其更改为

import 'package:flutter_project/home_page.dart';
Run Code Online (Sandbox Code Playgroud)


Xih*_*uny 5

在终端中,运行

flutter doctor -v

flutter upgrade

另外,尝试File > Invalidate Caches / Restart...从 Android studio 菜单

  • 文件>无效缓存/重新启动为我解决了这个问题。谢谢。 (2认同)

小智 5

如果我没记错的话,热重载会调用小部件的构建方法,因为您所做的更改不是在构建方法内进行的,所以它不会更改屏幕中的任何内容。

尝试更改 MyWidget Build 方法内的短信并查看它是否有效。

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new Scaffold(
      appBar: new AppBar(
        title: new Text("Demo Project"),
      ),
      body: new MyWidget(),
    ),
  ));
}

class MyWidget extends StatelessWidget {
  const MyWidget({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(child: new Text("Hello World!!!"));
  }
}
Run Code Online (Sandbox Code Playgroud)


LP *_*are 5

StatefulWidget下面代码中显示的类似代码包裹您的代码。这在观看旧教程时可能会令人困惑,因为它曾经在早期的 Flutter 版本中没有它。

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(home: MyApp()));
}

class MyApp extends StatefulWidget {
  MyApp({Key key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Demo Project"),
      ),
      body: Center(child: new Text("Hello World!!!")),
    );
  }
}

Run Code Online (Sandbox Code Playgroud)


Piy*_*ush 5

就我而言,它只是将整体提取MaterialApp到它自己的无状态中Widget

前 -

void main() {
  runApp(MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.teal,
        body: SafeArea(
            child: Container(
          color: Colors.white,
          child: Text("Helloo"),
          height: 100,
          width: 100,
          margin: EdgeInsets.all(20),
        )),
      ),
    ));
}
Run Code Online (Sandbox Code Playgroud)

后 -

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.teal,
        body: SafeArea(
            child: Container(
          color: Colors.white,
          child: Text("Helloo"),
          height: 100,
          width: 100,
          margin: EdgeInsets.all(20),
        )),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您只是在 main 函数中定义整个应用程序,甚至 VS Code 也会抱怨。

解决了!享受 :)