Flutter热重载与热替换插件angel3_hot的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter热重载与热替换插件angel3_hot的使用

angel3_hot 是一个支持 Angel3 服务器在文件更改时进行热重载的插件。它比简单地重启进程更加快速和可靠。请注意,此插件仅适用于 Angel3 框架,并且不建议在生产环境中使用,除非你特别需要“热代码推送”。

安装

在你的 pubspec.yaml 文件中添加依赖:

dependencies:
  angel3_framework: ^8.0.0
  angel3_hot: ^8.0.0

使用

该插件依赖于 Dart VM 服务,因此你需要使用 --observe(或 --enable-vm-service)参数来运行 Dart。使用方法相对简单:将创建 Angel 服务器的函数和要监视的路径集合传递给 HotReloader 构造函数。推荐的做法是在应用程序入口点单独定义一个创建 Angel 实例的函数,通常命名为 createServer

你可以监视以下内容:

  • 文件
  • 目录
  • Glob 模式
  • URI
  • package: URI

示例代码

下面是一个完整的示例 demo,展示了如何使用 angel3_hot 插件实现热重载功能。

main.dart

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_hot/angel3_hot.dart';
import 'package:logging/logging.dart';
import 'src/foo.dart';

Future<Angel> createServer() async {
  var app = Angel()..serializer = json.encode;

  // 修改这行代码,然后刷新浏览器页面查看效果!
  app.get('/', (req, res) => {'hello': 'hot world!'});
  app.get('/foo', (req, res) => Foo(bar: 'baz'));

  app.fallback((req, res) => throw AngelHttpException.notFound());

  app.encoders.addAll({
    'gzip': gzip.encoder,
    'deflate': zlib.encoder,
  });

  app.logger = Logger('angel')
    ..onRecord.listen((rec) {
      print(rec);
      if (rec.error != null) {
        print(rec.error);
        print(rec.stackTrace);
      }
    });

  return app;
}

void main() async {
  var hot = HotReloader(createServer, [
    Directory('src'),
    'main.dart',
    Uri.parse('package:angel3_hot/angel3_hot.dart')
  ]);
  await hot.startServer('127.0.0.1', 3000);
}

自定义响应头

如果你想自定义响应头,可以参考以下代码片段,移除 X-FRAME-OPTIONS 并添加 X-XSRF-TOKEN

import 'dart:io';
import 'package:angel3_hot/angel3_hot.dart';
import 'server.dart';

void main() async {
  var hot = HotReloader(createServer, [
    Directory('src'),
    'server.dart',
    // 也可以使用:Platform.script,
    Uri.parse('package:angel3_hot/angel3_hot.dart')
  ]);
  var http = await hot.startServer('127.0.0.1', 3000);

  // 移除 'X-FRAME-OPTIONS'
  http.defaultResponseHeaders.remove('X-FRAME-OPTIONS', 'SAMEORIGIN');

  // 添加 'X-XSRF-TOKEN'
  http.defaultResponseHeaders.add('X-XSRF-TOKEN',
      'a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e');
}

更多关于Flutter热重载与热替换插件angel3_hot的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter热重载与热替换插件angel3_hot的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用angel3_hot插件来实现热重载与热替换的一个简单示例。需要注意的是,angel3_hot插件本身并不是专门用于Flutter的热重载和热替换的,而是一个用于Dart服务器的热重载工具。不过,为了展示如何集成和使用类似功能的插件,我们可以借助Flutter的热重载机制以及类似功能的库(尽管不是angel3_hot本身,因为它主要用于Angel框架)。

Flutter自带的热重载机制已经非常强大,通常不需要额外的插件来实现基本的热重载功能。但是,如果你需要更复杂的热替换逻辑(比如在应用运行时替换整个模块或组件),你可能需要借助一些社区提供的库或者自己实现相关功能。

不过,为了贴近你的要求,并展示如何在Flutter项目中集成和使用类似热重载/热替换的工具,我们可以考虑使用flutter_hot_reload(注意:这是一个假设的库名,实际上Flutter的热重载是内置功能,不需要额外库,但这里为了演示如何集成外部库的概念,我们假设有这样的库)或者通过Flutter的HotRestartHotReload机制来模拟。

由于angel3_hot不是Flutter专用的,且Flutter的热重载是内置的,以下代码将展示如何使用Flutter内置的热重载机制,并通过一个简单的状态管理示例来模拟热替换的效果。

Flutter项目结构

假设你的Flutter项目结构如下:

my_flutter_app/
├── lib/
│   ├── main.dart
│   ├── home_screen.dart
│   └── counter_widget.dart
├── pubspec.yaml
└── ...

main.dart

import 'package:flutter/material.dart';
import 'home_screen.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Hot Reload Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomeScreen(),
    );
  }
}

home_screen.dart

import 'package:flutter/material.dart';
import 'counter_widget.dart';

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: CounterWidget(),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // Simulate hot replacement by forcing a state rebuild
          // In a real-world scenario, this could be triggered by some other mechanism
          setState(() {});
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

counter_widget.dart

import 'package:flutter/material.dart';

class CounterWidget extends StatefulWidget {
  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    // Simulate hot-swapped content by returning a different widget based on _counter
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          'You have pushed the button this many times:',
        ),
        Text(
          '$_counter',
          style: Theme.of(context).textTheme.headline4,
        ),
      ],
    );
  }
}

使用Flutter热重载

  1. 打开你的Flutter项目根目录。
  2. 运行flutter run命令启动应用。
  3. 修改counter_widget.dart文件中的任何内容,比如改变文本或添加新的UI元素。
  4. 保存文件后,Flutter将自动触发热重载,无需手动刷新应用即可看到更改。

注意

  • Flutter的热重载机制内置且非常高效,通常不需要额外的插件。
  • 如果你需要更复杂的热替换逻辑(如动态替换整个模块),你可能需要深入研究Flutter的插件系统或考虑使用其他框架/工具。
  • angel3_hot是一个用于Angel框架的Dart服务器热重载工具,不适用于Flutter客户端开发。

希望这个示例能帮助你理解Flutter中的热重载机制!如果你有更具体的需求或问题,请随时提问。

回到顶部