Flutter版本更新日志插件changelog_lib的使用

Flutter版本更新日志插件changelog_lib的使用

changelog.lib

:dart: changelog.lib: 构建您的更改日志提取器 :dart:

GitHub Workflow Status

项目主页

目录 #

  • 简介
  • 如何使用
  • 如何贡献
  • 许可证

简介 #

changelog_lib 是一个提供了一组工具包来构建 Dart 语言的更改日志提取器。

特别是,如果维护者在不同的项目中使用不同的语言,那么社区可能使用的标准就会成为一个问题。

例如,Dart 社区对生成更改日志有非常明确的标准。

通过此库,您可以编写自己的更改日志提取器,并且可以通过 PR 来改进现有的逻辑。

如何使用 #

要开始使用,请参考以下代码示例。

import 'package:changelog_lib/changelog_lib.dart';

/// 定义从源获取所有提交信息的 fetcher。
///
/// 作者: https://github.com/vincenzopalazzo
class FetcherMock extends GenericFetcher {
  FetcherMock() : super(start: "", end: "");

  [@override](/user/override)
  Future<List<CommitInfo>> fetch() {
    List<CommitInfo> commits = List.empty(growable: true);
    CommitAuthor author = CommitAuthor(
        commitDate: DateTime.now(),
        gitNickname: "vincenzopalazzo",
        email: "vincenzopalazzodev@gmail.com");
    CommitContent contentEmpty = CommitContent(
        commitHeader: "graphql: improve the interface", commitBody: "");
    CommitContent contentChange = CommitContent(
        commitHeader: "graphql_flutter: bump client version",
        commitBody: "Changelog-add: fixed client version in flutter wrapper");
    commits.add(CommitInfo(author: author, content: contentEmpty));
    commits.add(CommitInfo(author: author, content: contentChange));
    return Future.value(commits);
  }
}

Future<void> main() async {
  // 创建生成器并使用您自己的 fetcher,这样您就可以实现从任何来源(如 Github 等)获取数据。
  var generator =
      ChangelogGenerator(packageName: 'test', fetcher: FetcherMock());

  // 列表中的提交将根据这些规则进行过滤
  generator.addFilterRule(
      rule: FilterRule(exactMatch: "Changelog-add", nameSection: "Add"));
  // 为版本 0.0.1 生成更改日志
  var changelog = await generator.generate(versionName: "0.0.1");
  print(changelog);
  // FIXME: 您应该提供一个打印机来输出实际的更改日志生成器。
}

附加信息 #

该库欢迎建议或改进,并且如果您喜欢支持该项目,请考虑捐赠。

许可证 #

Copyright 2022 Vincenzo Palazzo &lt;vincenzopalazzodev@gmail.com&gt;. All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of Google Inc. nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

示例代码

import 'package:changelog_lib/changelog_lib.dart';

/// 定义从源获取所有提交信息的 fetcher。
///
/// 作者: https://github.com/vincenzopalazzo
class FetcherMock extends GenericFetcher {
  FetcherMock() : super(start: "", end: "");

  [@override](/user/override)
  Future<List<CommitInfo>> fetch() {
    List<CommitInfo> commits = List.empty(growable: true);
    CommitAuthor author = CommitAuthor(
        commitDate: DateTime.now(),
        gitNickname: "vincenzopalazzo",
        email: "vincenzopalazzodev@gmail.com");
    CommitContent contentEmpty = CommitContent(
        commitHeader: "graphql: improve the interface", commitBody: "");
    CommitContent contentChange = CommitContent(
        commitHeader: "graphql_flutter: bump client version",
        commitBody: "Changelog-add: fixed client version in flutter wrapper");
    commits.add(CommitInfo(author: author, content: contentEmpty));
    commits.add(CommitInfo(author: author, content: contentChange));
    return Future.value(commits);
  }
}

Future<void> main() async {
  // 创建生成器并使用您自己的 fetcher,这样您就可以实现从任何来源(如 Github 等)获取数据。
  var generator =
      ChangelogGenerator(packageName: 'test', fetcher: FetcherMock());

  // 列表中的提交将根据这些规则进行过滤
  generator.addFilterRule(
      rule: FilterRule(exactMatch: "Changelog-add", nameSection: "Add"));
  // 为版本 0.0.1 生成更改日志
  var changelog = await generator.generate(versionName: "0.0.1");
  print(changelog);
  // FIXME: 您应该提供一个打印机来输出实际的更改日志生成器。
}

更多关于Flutter版本更新日志插件changelog_lib的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter版本更新日志插件changelog_lib的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用changelog_lib插件来展示版本更新日志的示例。这个插件可以帮助你轻松地在应用中展示版本更新信息。

首先,确保你的Flutter环境已经配置正确,并且你有一个正在开发的Flutter项目。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  changelog_lib: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

2. 准备更新日志

创建一个名为changelog.json的文件,并将其放在你的assets目录下(如果assets目录不存在,请先创建它)。在pubspec.yaml中注册这个资产文件:

flutter:
  assets:
    - assets/changelog.json

changelog.json的内容示例如下:

[
  {
    "version": "1.0.1",
    "date": "2023-10-01",
    "changes": [
      "修复了应用启动时的崩溃问题",
      "优化了用户界面"
    ]
  },
  {
    "version": "1.0.0",
    "date": "2023-09-15",
    "changes": [
      "初始版本发布",
      "添加了核心功能"
    ]
  }
]

3. 使用插件展示更新日志

在你的Flutter应用中,你可以使用changelog_lib来展示这些更新日志。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:changelog_lib/changelog_lib.dart';
import 'dart:convert';
import 'package:flutter/services.dart' show rootBundle;

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Changelog> changelogs = [];

  @override
  void initState() {
    super.initState();
    _loadChangelogs();
  }

  Future<void> _loadChangelogs() async {
    String jsonData = await rootBundle.loadString('assets/changelog.json');
    List<dynamic> changelogList = jsonDecode(jsonData);
    changelogs = changelogList.map((e) => Changelog.fromJson(e)).toList();
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('更新日志'),
      ),
      body: changelogs.isEmpty
          ? Center(child: CircularProgressIndicator())
          : ListView.builder(
              itemCount: changelogs.length,
              itemBuilder: (context, index) {
                return Card(
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Text(
                          '版本 ${changelogs[index].version} - ${changelogs[index].date}',
                          style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
                        ),
                        SizedBox(height: 8),
                        Wrap(
                          spacing: 4,
                          runSpacing: 4,
                          children: changelogs[index].changes.map((change) {
                            return Text(change);
                          }).toList(),
                        ),
                      ],
                    ),
                  ),
                );
              },
            ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 这里可以添加检查更新或跳转到应用商店的逻辑
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => ChangelogScreen(changelogs: changelogs)),
          );
        },
        tooltip: '查看更新日志',
        child: Icon(Icons.info),
      ),
    );
  }
}

注意:上面的代码示例中,Changelog类需要你自己根据changelog.json的结构来定义,例如:

class Changelog {
  String version;
  String date;
  List<String> changes;

  Changelog({
    required this.version,
    required this.date,
    required this.changes,
  });

  factory Changelog.fromJson(Map<String, dynamic> json) {
    return Changelog(
      version: json['version'] as String,
      date: json['date'] as String,
      changes: List<String>.from(json['changes'] as List),
    );
  }
}

此外,ChangelogScreenchangelog_lib插件提供的一个方便的屏幕小部件,用于显示更新日志。你可以根据插件的文档进行进一步的自定义和集成。

这个示例展示了如何加载和显示更新日志,但你可能还需要添加逻辑来检查应用的当前版本,并在有新版本时提示用户查看更新日志。这通常涉及到与你的后端服务或应用商店API的交互。

回到顶部