Flutter数据仓库管理插件repository的使用

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

Flutter数据仓库管理插件repository的使用

Repository

这是一个用于通过REST API获取远程数据的一体化解决方案,利用缓存和自动刷新的强大功能。

警告 ⚠️

此包目前正处于开发阶段,尚未准备好用于生产环境。我们的开发团队正在积极工作,并不断添加新功能和进行改进。

虽然我们正在努力使这个包尽可能稳定和可靠,但在添加新代码或修改现有代码时可能会出现错误或问题。我们鼓励您在此开发过程中报告遇到的任何问题,我们会尽快解决它们。

在继续开发此包的过程中,我们可能会对API或其他方面进行重大更改。我们将尽最大努力记录此类更改,并提供如何相应更新代码的指导。

感谢您的耐心和支持,因为我们致力于将此包成熟化。我们致力于交付高质量、可靠的包,以满足用户的需求,我们相信通过您的反馈和支持,我们可以实现这一目标。

安装 💻

❗ 为了开始使用Repository,您必须在机器上安装Dart SDK。

repository添加到您的pubspec.yaml文件中:

dependencies:
  repository: ^3.0.0

安装它:

dart pub get

持续集成 🤖

Repository附带一个内置的GitHub Actions工作流,由Very Good Workflows驱动,但您也可以添加您首选的CI/CD解决方案。

开箱即用,在每次拉取请求和推送时,CI都会格式化、检查和测试代码。这确保了代码在您添加功能或进行更改时保持一致并正确运行。项目使用Very Good Analysis来进行严格的分析选项集,由我们的团队使用。代码覆盖率通过Very Good Workflows强制执行。

运行测试 🧪

要运行所有单元测试:

dart pub global activate coverage 1.2.0
dart test --coverage=coverage
dart pub global run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info

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

# 生成覆盖率报告
genhtml coverage/lcov.info -o coverage/

# 打开覆盖率报告
open coverage/index.html

完整示例Demo

以下是一个完整的Flutter应用示例,演示如何使用repository插件来管理数据仓库。

1. 添加依赖项

首先,在pubspec.yaml中添加repository依赖项:

dependencies:
  flutter:
    sdk: flutter
  repository: ^3.0.0
  http: ^0.13.3 # 用于HTTP请求

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

2. 创建数据模型

创建一个简单的数据模型类,例如User

class User {
  final int id;
  final String name;

  User({required this.id, required this.name});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
    );
  }
}

3. 创建Repository

创建一个UserRepository类来处理数据获取和缓存:

import 'package:repository/repository.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'user.dart';

class UserRepository extends Repository<User> {
  [@override](/user/override)
  Future<List<User>> fetch() async {
    final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/users'));
    if (response.statusCode == 200) {
      // 解析JSON数据
      List<dynamic> body = json.decode(response.body);
      List<User> users = body.map((dynamic item) => User.fromJson(item)).toList();
      return users;
    } else {
      throw Exception('Failed to load users');
    }
  }

  [@override](/user/override)
  String getId(User user) {
    return user.id.toString(); // 返回用户的唯一标识符
  }
}

4. 使用Repository

在Flutter应用中使用UserRepository来获取和显示用户数据:

import 'package:flutter/material.dart';
import 'user_repository.dart'; // 导入UserRepository
import 'user.dart'; // 导入User模型

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

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

class UserListScreen extends StatefulWidget {
  [@override](/user/override)
  _UserListScreenState createState() => _UserListScreenState();
}

class _UserListScreenState extends State<UserListScreen> {
  late final UserRepository _userRepository;

  [@override](/user/override)
  void initState() {
    super.initState();
    _userRepository = UserRepository(); // 初始化UserRepository
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Users'),
      ),
      body: FutureBuilder<List<User>>(
        future: _userRepository.fetch(), // 获取用户数据
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(child: CircularProgressIndicator());
          } else if (snapshot.hasError) {
            return Center(child: Text('Error: ${snapshot.error}'));
          } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
            return Center(child: Text('No Users Found'));
          } else {
            final users = snapshot.data!;
            return ListView.builder(
              itemCount: users.length,
              itemBuilder: (context, index) {
                final user = users[index];
                return ListTile(
                  title: Text(user.name),
                  subtitle: Text('ID: ${user.id}'),
                );
              },
            );
          }
        },
      ),
    );
  }
}

更多关于Flutter数据仓库管理插件repository的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据仓库管理插件repository的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,数据仓库管理(Repository Pattern)是一种常见的设计模式,用于抽象和管理数据访问逻辑,使得UI层与数据访问层解耦。Repository模式通常与Provider、Riverpod或GetX等状态管理库一起使用,以实现数据的流动和状态管理。

下面是一个简单的示例,展示如何在Flutter中使用Repository模式管理数据。为了简洁起见,我们将使用SQLite作为数据源,并通过一个自定义的UserRepository来管理用户数据的CRUD(创建、读取、更新、删除)操作。同时,我们会使用sqflite插件来与SQLite数据库交互。

1. 添加依赖

首先,在pubspec.yaml文件中添加sqflite依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.2  # 请检查最新版本号

2. 创建数据库帮助类

创建一个DatabaseHelper类来处理数据库操作:

import 'dart:async';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';

class DatabaseHelper {
  static Database? _db;

  Future<Database> get db async {
    if (_db == null) {
      _db = await initDb();
    }
    return _db!;
  }

  Future<Database> initDb() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, 'user_database.db');
    return await openDatabase(path, version: 1, onCreate: _onCreate);
  }

  Future _onCreate(Database db, int version) async {
    await db.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
  }

  Future<void> insertUser(User user) async {
    final db = await db;
    await db.insert('users', user.toMap());
  }

  Future<List<User>> getUsers() async {
    final db = await db;
    final List<Map<String, dynamic>> results = await db.query('users');
    return results.map((e) => User.fromMap(e)).toList();
  }

  // 其他CRUD操作可以在这里添加
}

class User {
  int? id;
  String name;

  User({required this.name});

  Map<String, dynamic> toMap() {
    return {'name': name, 'id': id};
  }

  factory User.fromMap(Map<String, dynamic> map) {
    return User(name: map['name'] as String);
  }
}

3. 创建Repository类

接下来,创建一个UserRepository类来封装数据库操作:

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

class UserRepository with ChangeNotifier {
  final DatabaseHelper _dbHelper = DatabaseHelper();

  Future<void> addUser(User user) async {
    await _dbHelper.insertUser(user);
    notifyListeners();
  }

  Future<List<User>> getAllUsers() async {
    List<User> users = await _dbHelper.getUsers();
    notifyListeners();
    return users;
  }

  // 其他业务逻辑可以在这里添加,比如更新用户、删除用户等
}

4. 在UI中使用Repository

最后,在UI中使用Provider来提供UserRepository实例,并在UI组件中监听数据变化:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'user_repository.dart';

void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => UserRepository()),
      ],
      child: MyApp(),
    ),
  );
}

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

class UserListScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final userRepository = Provider.of<UserRepository>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('User List'),
      ),
      body: FutureBuilder<List<User>>(
        future: userRepository.getAllUsers(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(child: CircularProgressIndicator());
          } else if (snapshot.hasError) {
            return Center(child: Text('Error: ${snapshot.error!}'));
          } else {
            List<User> users = snapshot.data ?? [];
            return ListView.builder(
              itemCount: users.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(users[index].name),
                );
              },
            );
          }
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          await userRepository.addUser(User(name: 'New User'));
        },
        tooltip: 'Add User',
        child: Icon(Icons.add),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的用户管理系统,包括数据库帮助类、Repository类和UI组件。UserRepository类封装了与数据库交互的逻辑,并通过ChangeNotifier通知UI层数据的变化。UI层使用ProviderFutureBuilder来监听和显示数据。

回到顶部