Flutter集成Strapi CMS插件gits_strapi的使用

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

Flutter集成Strapi CMS插件gits_strapi的使用

Gits Strapi

此包用于简化与Strapi的集成。

Gits Strapi

前置条件

该库使用了 gits_http 包。

必须了解的信息

请求返回的对象通常包含以下键:

  • <code>data</code>: 响应数据本身,可能为:
    • 单个条目,作为具有以下键的对象:
      • <code>id</code> (数字)
      • <code>attributes</code> (对象)
      • <code>meta</code> (对象)
    • 条目的列表,作为对象数组
    • 自定义响应
  • <code>meta</code> (对象): 关于分页、发布状态、可用语言等信息。
  • <code>error</code> (对象, 可选): 请求时抛出的任何错误信息。

使用方法

首先初始化 gits_strapi 如下:

final GitsStrapi strapi = GitsStrapi(
  timeout: 30000,
  showLog: true,
  gitsInspector: GitsInspector(),
);

之后我们可以使用一些主要功能:

Auth Login (身份验证登录)

用于标准的Strapi登录需求,如果有其他需求则使用其他功能。

AuthResponse loginResponse = await strapi.login(
  endpoint: Uri.parse("http://10.0.2.2:1337/api/auth/local"),
  body: {"identifier": "identifier", "password": "password"},
);

Auth Register (身份验证注册)

用于标准的Strapi注册需求,如果有其他需求则使用其他功能。

AuthResponse registerResponse = await strapi.register(
  endpoint: Uri.parse("http://10.0.2.2:1337/api/auth/local/register"),
  body: {
    "username": "username",
    "email": "email",
    "password": "password"
  },
);

Get Single Response (获取单个响应)

用于检索单个对象的数据,如果需要检索大量数据请使用 <code>Get Collection Response</code>

Uri endpointProductOne =
  Uri.parse("http://10.0.2.2:1337/api/products/1").withParam(
  const StrapiRequest(
    populate: ["images"],
  ),
);

SingleResponse<DataResponse<ProductResponse>> singleResponse =
  await strapi.getSingle(endpoint: endpointProductOne).then((value) {
  var attr = ProductResponse.fromMap(value.data?.attributes);
  var data = DataResponse(id: value.data?.id, attributes: attr);
  return SingleResponse(data: data, meta: value.meta, error: value.error);
});

Get Collection Response (获取集合响应)

用于基于对象列表检索数据,如果需要检索单个对象数据请使用 <code>Get Single Response</code>

Uri endpointProducts = Uri.parse("http://10.0.2.2:1337/api/products")
  .withParam(
    const StrapiRequest(page: 1, pageSize: 3, sort: ['id:desc']),
  );

CollectionResponse<DataResponse<ProductResponse>> collectionResponse =
  await strapi.getCollection(endpoint: endpointProducts).then((value) {
  var data = <DataResponse<ProductResponse>>[];
  value.data?.forEach((item) {
    data.add(
      DataResponse(
        id: item.id,
        attributes: ProductResponse.fromMap(item.attributes),
      ),
    );
  });
  return CollectionResponse(
    data: data,
    meta: value.meta,
    error: value.error,
  );
});

(Get) Select (选择)

用于 <code>GET</code> 方法需求。

Response select = await strapi.select(endpoint: Uri.parse("endpoint"));

(POST) Create (创建)

用于 <code>POST</code> 方法需求。

var insertBody = {
  "data": {
    "name": "name",
    "description": "description",
    "price": 10000,
    "stock": 5,
  }
};
Response insert = await strapi.create(
  endpoint: Uri.parse("http://10.0.2.2:1337/api/products"),
  headers: {
    'Authorization':
      'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiaWF0IjoxNjYxMjM2OTgwLCJleHAiOjE2NjM4Mjg5ODB9.Cb-wP8EUPUcwp76VD_IWqsw5nvi9xv0QqH0Ng4EB1UI',
  },
  body: insertBody,
);

(PUT) Update (更新)

用于 <code>PUT</code> 方法需求。

var updateBody = {
  "data": {
    "name": "name",
    "description": "description",
    "price": 50000,
    "stock": 3,
  }
};
Response updateResponse = await strapi.update(
  id: "1",
  endpoint: Uri.parse("http://10.0.2.2:1337/api/products"),
  headers: {
    'Authorization':
      'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiaWF0IjoxNjYxMjM2OTgwLCJleHAiOjE2NjM4Mjg5ODB9.Cb-wP8EUPUcwp76VD_IWqsw5nvi9xv0QqH0Ng4EB1UI',
  },
  body: updateBody,
);

Delete (删除)

用于 <code>DELETE</code> 方法需求。

Response deleteResponse = await strapi.delete(
  headers: {
    'Authorization':
      'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiaWF0IjoxNjYxMjM2OTgwLCJleHAiOjE2NjM4Mjg5ODB9.Cb-wP8EUPUcwp76VD_IWqsw5nvi9xv0QqH0Ng4EB1UI',
  },
  endpoint: Uri.parse("http://10.0.2.2:1337/api/products"),
  id: "9",
);

辅助功能

Strapi Request (Strapi 请求)

我们提供了一些必需的请求参数,如:

  • populate (List)
  • fields (List)
  • sort (List)
  • withCount (bool)
  • pageSize (int)
  • page (int)

例如:

StrapiRequest(
  fields: ['id', 'name'],
  populate: ['images', 'transactions'],
  sort: ['id:desc'],
  page: 1,
  pageSize: 10,
  withCount: true,
);

Entity Mapper (实体映射)

为了将响应转换为 Entity,提供了几种基本响应,包括:

  • SingleResponse
  • CollectionResponse
  • DataResponse
  • MetaResponse
  • PaginationResponse
  • ErrorResponse
  • AuthResponse
  • UserResponse
  • ThumbnailResponse
  • FormatsResponse
  • ImageResponse

使用方法如下:

对于带有泛型类的响应:

var collectionEntity = collectionResponse.toEntity(
  (data) => data
    .map((item) => (item as DataResponse)
      .toEntity((attr) => (attr as ProductResponse).toEntity()))
    .toList(),
);

如果没有泛型类:

ProductResponse().toEntity();

更多关于Flutter集成Strapi CMS插件gits_strapi的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集成Strapi CMS插件gits_strapi的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成Strapi CMS并使用gits_strapi插件(假设这是一个存在的插件,用于与Strapi进行交互),通常需要以下几个步骤:

  1. 添加依赖:首先,你需要在pubspec.yaml文件中添加gits_strapi依赖。
dependencies:
  flutter:
    sdk: flutter
  gits_strapi: ^x.y.z  # 请将x.y.z替换为实际的版本号

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

  1. 配置Strapi API端点:你需要在应用的某个地方(比如App类的初始化方法中)配置Strapi的API端点。
import 'package:flutter/material.dart';
import 'package:gits_strapi/gits_strapi.dart';

void main() {
  // 配置Strapi API端点
  StrapiClient.configure(
    baseUrl: 'https://your-strapi-api-endpoint.com',
    apiKey: 'your-api-key',  // 如果Strapi需要API密钥进行身份验证
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}
  1. 获取数据:接下来,你可以使用StrapiClient来获取数据。例如,获取文章列表:
import 'package:flutter/material.dart';
import 'package:gits_strapi/gits_strapi.dart';

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

class _HomeScreenState extends State<HomeScreen> {
  List<Article> articles = [];

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

  void fetchArticles() async {
    try {
      final response = await StrapiClient.getEntries<Article>('articles');
      setState(() {
        articles = response.data;
      });
    } catch (e) {
      print('Error fetching articles: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Strapi CMS Articles'),
      ),
      body: ListView.builder(
        itemCount: articles.length,
        itemBuilder: (context, index) {
          final article = articles[index];
          return ListTile(
            title: Text(article.title),
            subtitle: Text(article.content.substring(0, 100)),  // 截取内容以显示摘要
          );
        },
      ),
    );
  }
}

// 假设Article类结构如下
class Article {
  String id;
  String title;
  String content;

  // 其他可能的字段...

  Article({
    required this.id,
    required this.title,
    required this.content,
  });

  factory Article.fromJson(Map<String, dynamic> json) {
    return Article(
      id: json['id'] as String,
      title: json['title'] as String,
      content: json['content'] as String,
      // 其他字段的解析...
    );
  }
}
  1. 显示数据:在上面的例子中,我们已经展示了如何使用ListView.builder来显示文章列表。你可以根据需要进一步自定义UI。

请注意,gits_strapi是一个假设的插件名称,实际中你可能需要查找并使用一个真实的Flutter插件来与Strapi进行交互。如果gits_strapi不存在,你可能需要查看Strapi的官方文档或社区资源,找到一个合适的Flutter插件,或者自己编写一个与Strapi API进行交互的插件。

回到顶部