Flutter静态内容管理插件static_micro_cms的使用

Flutter静态内容管理插件static_micro_cms的使用

简介

static_micro_cms 是一个帮助你使用微CMS(microCMS)创建静态网页的包。它基于 Jamstack 构建,使你能够使用 Flutter 创建静态 Web 页面。

pub package ```

特性

当你使用这个包时,你可以利用微CMS(一个无头内容管理系统)创建静态网页。它在构建应用程序之前加载所有 API 数据,因此在运行时无需访问 API,并且无需在源代码中保存 API 密钥。这提供了更安全和更快的网站。它还可以在持续集成环境中加载数据。

入门指南

以下是使用 static_micro_cms 的步骤:

  1. https://microcms.io/ 创建一个微CMS API。
  2. 创建内容并定义模式。
  3. 下载 API 模式文件并将其放在项目中(例如 ./schemas/api-xxx-000.json)。你可以在 [API 设置] 中获取它。
  4. pubspec.yaml 文件中描述配置,如下所示:
    #...
    static_micro_cms:
      baseUrl: "https://[你的项目名称].microcms.io/api/v1"
      apis:
        - endpoint: profile
          type: object
          schema: schema/api-profile-20211122080708.json
        - endpoint: news
          type: list
          schema: schema/api-news-20211121223418.json
    #...
    
  5. 从 CMS 控制台获取 API 密钥,并将其放入项目根目录下的 .env 文件中,如下所示:
    API_KEY=[你的 API 密钥]
    
  6. 运行 flutter pub run static_micro_cms 来加载数据并生成类型定义。然后,types.microcms.g.dartdatastore.microcms.g.dart 将在 /lib 文件夹中生成。
  7. (可选)如果你不想上传 API 数据,可以将 *.microcms.g.dart 添加到 .gitignore 文件中。

使用方法

生成 API 数据后,你可以通过 MicroCMSDataStore.[endpoint]Data 使用这些数据。

配置说明
  • baseUrl: (必填) API 的基础 URL。你可以在 [API 预览] 窗口中找到它。
  • apis.endpoint: (必填) 内容的端点名称。
  • apis.type: (必填) 内容类型。“object” 或 “list”。
  • apis.schema: (必填) 模式文件路径。
更新仅类型定义

如果你更新了 API 模式但想避免不必要的通信,可以尝试 flutter pub run static_micro_cms --dry。它只会更新类型定义。

实现进度

  • 内容
    • ✅ 对象
    • ✅ 列表
  • 类型
    • ✅ 文本
    • ✅ 文本区域
    • ✅ 富文本编辑器
    • ✅ 图像
    • ✅ 日期
    • ✅ 布尔值
    • ❌ 选择
    • ✅ 数字
    • ✅ 自定义
    • ❌ 重复器
      • 单字段类型仅支持

完整示例

以下是一个完整的示例,展示了如何使用 static_micro_cms 插件。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

更多关于Flutter静态内容管理插件static_micro_cms的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter静态内容管理插件static_micro_cms的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 static_micro_cms 插件在 Flutter 应用中管理静态内容的示例代码。这个插件允许你从静态文件(如 JSON 或 YAML)中加载内容,非常适合用于管理简单的静态内容,比如应用内的文案、配置等。

首先,确保你已经在 pubspec.yaml 文件中添加了 static_micro_cms 依赖:

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

然后,运行 flutter pub get 来获取依赖。

接下来,假设你有一个 data 文件夹,里面包含了一个名为 content.json 的文件,内容如下:

{
  "home": {
    "title": "欢迎来到我的应用",
    "description": "这是一个使用 static_micro_cms 管理静态内容的示例应用。"
  },
  "about": {
    "title": "关于我们",
    "content": "我们致力于提供最好的用户体验。"
  }
}

接下来,在你的 Flutter 应用中加载和使用这些内容。下面是一个完整的示例代码:

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

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

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

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

class _HomeScreenState extends State<HomeScreen> {
  late Map<String, dynamic> _content;

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

  Future<void> _loadContent() async {
    // 使用 StaticMicroCMS 加载 JSON 文件
    final cms = StaticMicroCMS(
      dataSource: DataSource.asset('data/content.json'),
    );

    try {
      final data = await cms.load();
      setState(() {
        _content = data!;
      });
    } catch (e) {
      print('Failed to load content: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Static Micro CMS Demo'),
      ),
      body: Center(
        child: _content.isEmpty
            ? CircularProgressIndicator()
            : Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text(
                    _content['home']['title'] ?? '',
                    style: TextStyle(fontSize: 24),
                  ),
                  SizedBox(height: 16),
                  Text(
                    _content['home']['description'] ?? '',
                    style: TextStyle(fontSize: 16),
                  ),
                  SizedBox(height: 32),
                  ElevatedButton(
                    onPressed: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(builder: (context) => AboutScreen(_content)),
                      );
                    },
                    child: Text('关于我们'),
                  ),
                ],
              ),
      ),
    );
  }
}

class AboutScreen extends StatelessWidget {
  final Map<String, dynamic> content;

  AboutScreen(this.content);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('关于我们'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              content['about']['title'] ?? '',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 16),
            Text(
              content['about']['content'] ?? '',
              style: TextStyle(fontSize: 16),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. initState 方法中,使用 StaticMicroCMSdata/content.json 文件中加载数据。
  2. 将加载的数据存储在 _content 变量中。
  3. build 方法中,根据加载的数据显示首页的内容。
  4. 添加了一个按钮,点击按钮后导航到 AboutScreen 页面,并传递加载的内容数据。

这样,你就可以使用 static_micro_cms 插件在 Flutter 应用中方便地管理静态内容了。

回到顶部