Showwcase

coverage
style: very good analysis

Very Good CLI 生成?

Showwcase 是一个专为开发者打造的专业社交网络,旨在连接、建立社区和寻找新机会。


入门?

此项目包含 3 种风味

  • 开发
  • 测试
  • 生产

要运行所需的风味,可以使用 VSCode/Android Studio 中的启动配置,或使用以下命令

# Development
$ flutter run --flavor development --target lib/main_development.dart

# Staging
$ flutter run --flavor staging --target lib/main_staging.dart

# Production
$ flutter run --flavor production --target lib/main_production.dart

*Showwcase 支持 iOS、Android 和 Web。


正在运行测试?

要运行所有单元和 widget 测试,请使用以下命令

$ flutter test --coverage --test-randomize-ordering-seed random

要查看生成的覆盖率报告,您可以使用 lcov

# Generate Coverage Report
$ genhtml coverage/lcov.info -o coverage/

# Open Coverage Report
$ open coverage/index.html

正在处理翻译?

本项目依赖于 flutter_localizations,并遵循 Flutter 官方国际化指南

添加字符串

  1. 要添加新的本地化字符串,请打开位于 lib/l10n/arb/app_en.arbapp_en.arb 文件。

{
    "@@locale": "en",
    "counterAppBarTitle": "Counter",
    "@counterAppBarTitle": {
        "description": "Text shown in the AppBar of the Counter Page"
    }
}
  1. 然后添加新的键/值和描述

{
    "@@locale": "en",
    "counterAppBarTitle": "Counter",
    "@counterAppBarTitle": {
        "description": "Text shown in the AppBar of the Counter Page"
    },
    "helloWorld": "Hello World",
    "@helloWorld": {
        "description": "Hello World Text"
    }
}
  1. 使用新字符串

import 'package:showwcase/l10n/l10n.dart';

@override
Widget build(BuildContext context) {
  final l10n = context.l10n;
  return Text(l10n.helloWorld);
}

添加支持的区域设置

更新位于 ios/Runner/Info.plistInfo.plist 中的 CFBundleLocalizations 数组,以包含新的区域设置。

    ...

    <key>CFBundleLocalizations</key>
	<array>
		<string>en</string>
		<string>es</string>
	</array>

    ...

添加翻译

  1. 对于每个支持的区域设置,请在 lib/l10n/arb 中添加一个新的 ARB 文件。

├── l10n
│   ├── arb
│   │   ├── app_en.arb
│   │   └── app_es.arb
  1. 将翻译后的字符串添加到每个 .arb 文件中

app_en.arb

{
    "@@locale": "en",
    "counterAppBarTitle": "Counter",
    "@counterAppBarTitle": {
        "description": "Text shown in the AppBar of the Counter Page"
    }
}

app_es.arb

{
    "@@locale": "es",
    "counterAppBarTitle": "Contador",
    "@counterAppBarTitle": {
        "description": "Texto mostrado en la AppBar de la página del contador"
    }
}

架构?

本项目采用了适用于 Flutter 移动应用开发的 Clean Architecture 的改编版本。

Clean Architecture 是一系列原则,其主要目的是隐藏应用程序领域逻辑的实现细节。

这样我们就可以将逻辑隔离开来,从而随着时间的推移实现更易于维护和可扩展的逻辑。

与其它架构相比,Clean Architecture 的主要特点是依赖规则。

在 Clean Architecture 中,应用程序被划分为不同的职责,每个职责都表示为一个层。

应用程序中的层

领域层 domain

领域是应用程序的核心,必须完全独立于业务逻辑或数据之外的任何依赖。领域层代表了我们所知的业务模型或业务逻辑的实现。业务逻辑是指即使我们没有应用程序来自动化公司流程,仍然存在的逻辑。它由以下元素组成。

实体 domain / entities

实体包含业务数据。应用程序的实体可以在公司内的不同应用程序之间共享。每个实体都实现为一个类,其属性对应于业务模型中实体的特征。实体不得实现与业务模型无关的方法或任何类型的逻辑。像解析 API 返回的数据的逻辑等实现细节不应放在实体中,因为领域层必须独立于应用程序中使用的实现类型。

存储库 domain / repositories

领域层中的存储库(也称为适配器)负责建立数据层必须实现的接口以获取信息。存储库是数据层和领域层之间的连接点。它仅表示为一个抽象类,其中指定了必须在数据层中实现的方法。

数据层

模型 data / models

模型扩展了 domain / entities 中定义的类,并实现了必要的​​方法来解析来自数据库或 API 的信息,在这种特定情况下,它们负责将 API 以 json 格式发送的信息转换为相应的对象(实体)。如果需要将信息发送到 API,它们还可以包含以适当格式编码信息的方法。

数据源 data / datasources

datasources 是负责向 API 发送 http 请求或直接与数据库交互的类。它们使用模型来解码和编码信息。

存储库 data / repositories

数据层中的存储库负责实现领域层中先前定义的存储库,它们使用 datasources 来执行必要的数据操作。存储库不直接向 API 发送请求的原因是保证了耦合性,这使我们能够用另一个数据源替换一个数据源,或者在不更改整个存储库实现的情况下在存储库中使用多个数据源。它还允许独立测试存储库和数据源的实现。

表示层

表示层包含与应用程序 UI 相关的所有内容,其结构可能有所不同。此层使用领域层公开的存储库定义来执行其操作。

使用 Clean Architecture 的优势

使用 Clean Architecture 的主要优势是

  • 独立于框架。它不与库耦合,这使得这些库可以被用作易于替换的工具。

  • 可测试。层及其组件易于测试,无需用户界面、数据库、Web 服务器等。

  • 独立于用户界面。用户界面易于替换,允许进行更新

GitHub

查看 Github