Flutter数据库查询插件fl_query的使用

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

Flutter数据库查询插件fl_query的使用

Fl-Query Logo

Fl-Query简介

Fl-Query是一个为Flutter设计的异步数据缓存、重新获取和失效库。它允许你在不接触任何全局状态的情况下管理和分发异步数据,让异步服务器状态管理变得轻而易举。

特性

  • 异步数据缓存与管理
  • 智能且有效的重新获取
  • 乐观更新
  • 自动缓存的数据失效和不需要的查询/变更垃圾回收
  • 通过InfiniteQuery实现无限分页
  • 使用Hive进行持久化缓存(可选)
  • 简单易懂的代码,遵循DRY原则
  • 兼容原生Flutter和flutter_hooks

安装

普通安装:

$ flutter pub add fl_query

对于使用flutter_hooks的用户(欢迎加入酷炫的Flutter社区😎):

$ flutter pub add flutter_hooks fl_query_hooks

文档

你可以在这里找到fl-query的文档。

基本用法

初始化缓存数据库

main方法中初始化缓存数据库:

fl-query使用Hive将数据持久化到磁盘

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await QueryClient.initialize(cachePrefix: 'fl_query_example');
  runApp(MyApp());
}

包装MaterialApp

MyApp Widget的build方法中使用QueryClientProvider包装你的MaterialApp

Widget build(BuildContext context) {
  return QueryClientProvider(
    child: MaterialApp(
      title: 'Fl-Query Example App',
      theme: ThemeData(
        useMaterial3: true,
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    ),
  );
}

使用Query

FL-Query提供了一个QueryBuilder widget来创建和监听指定的Query,并在有更新时重新运行构建函数。它有两个必需的参数(未命名):keybuilder

示例代码

这是一个简单的例子,展示了如何使用QueryBuilder

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return QueryBuilder<String, dynamic>(
      'hello',
      () {
        return Future.delayed(
            const Duration(seconds: 6), () => 'Hello World!');
      },
      initial: 'A replacement',
      jsonConfig: JsonConfig(
        fromJson: (json) => json['data'],
        toJson: (data) => {'data': data},
      ),
      onData: (value) {
        debugPrint('onData: $value');
      },
      onError: (error) {
        debugPrint('onError: $error');
      },
      builder: (context, query) {
        if (query.isLoading) {
          return const Center(
            child: CircularProgressIndicator(),
          );
        } else if (query.hasError) {
          return Center(
            child: Text(query.error.toString()),
          );
        }
        return Center(
          child: Text(query.data ?? "Unfortunately, there's no data"),
        );
      },
    );
  }
}

如果你使用的是flutter_hooks,你可以这样写:

class MyApp extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final query = useQuery<String, dynamic>(
      'hello',
      () {
        return Future.delayed(
            const Duration(seconds: 6), () => 'Hello World!');
      },
      initial: 'A replacement',
      jsonConfig: JsonConfig(
        fromJson: (json) => json['data'],
        toJson: (data) => {'data': data},
      ),
      onData: (value) {
        debugPrint('onData: $value');
      },
      onError: (error) {
        debugPrint('onError: $error');
      },
    );

    if (query.isLoading) {
      return const Center(
        child: CircularProgressIndicator(),
      );
    } else if (query.hasError) {
      return Center(
        child: Text(query.error.toString()),
      );
    }
    return Center(
      child: Text(query.data ?? "Unfortunately, there's no data"),
    );
  }
}

更多关于fl-query的信息,请访问官方博客:https://fl-query.krtirtho.dev/blog

总结

Fl-Query的主要目的是以最少的代码量和最高的代码重用性及性能,提供一种最简单的方式来管理复杂的服务器状态部分。这让你可以专注于那些酷炫的UI动画和过渡✨,把繁琐的工作交给fl-query处理。

如果你想了解更多关于fl-query的内容,或者有任何问题,欢迎访问其官方网站或参与GitHub上的讨论。


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

1 回复

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


当然,关于Flutter中的fl_query插件(假设它是一个用于数据库查询的Flutter插件,尽管这不是一个广为人知的官方或广泛使用的插件名称,但我会基于这个假设给出一个示例),以下是一个简要的介绍和代码案例。

在Flutter中,处理数据库查询通常使用的是sqflite插件,这是一个广泛使用的SQLite数据库插件。不过,由于你的要求是关于fl_query,我将假设fl_query提供了类似的接口,并给出一个模拟的代码案例。请注意,实际使用时你需要参考fl_query的官方文档。

假设的fl_query插件使用案例

1. 添加依赖

首先,在你的pubspec.yaml文件中添加fl_query依赖(注意:这只是一个假设的依赖名,实际使用时请替换为真实的插件名)。

dependencies:
  flutter:
    sdk: flutter
  fl_query: ^x.y.z  # 替换为实际的版本号

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

2. 初始化数据库

在你的Flutter应用中,初始化数据库并打开连接。

import 'package:flutter/material.dart';
import 'package:fl_query/fl_query.dart'; // 假设的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Database Query Example'),
        ),
        body: DatabaseExample(),
      ),
    );
  }
}

class DatabaseExample extends StatefulWidget {
  @override
  _DatabaseExampleState createState() => _DatabaseExampleState();
}

class _DatabaseExampleState extends State<DatabaseExample> {
  FlDatabase? _db;

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

  Future<void> _initDatabase() async {
    // 打开数据库连接(假设的API)
    _db = await FlDatabase.openDatabase(inMemoryDatabasePath);

    // 创建表(示例)
    await _db!.execute('''
      CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        age INTEGER NOT NULL
      )
    ''');

    // 插入一些数据(示例)
    await _db!.insert('users', {'name': 'Alice', 'age': 30});
    await _db!.insert('users', {'name': 'Bob', 'age': 25});
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: () async {
          // 执行查询(示例)
          List<Map<String, dynamic>> result = await _queryDatabase();
          print(result);
        },
        child: Text('Query Database'),
      ),
    );
  }

  Future<List<Map<String, dynamic>>> _queryDatabase() async {
    // 假设的查询API
    return await _db!.query('users', where: 'age > ?', whereArgs: [20]);
  }

  @override
  void dispose() {
    _db?.close();
    super.dispose();
  }
}

3. 运行应用

运行你的Flutter应用,点击按钮后,它会在控制台中打印出年龄大于20的用户列表。

注意

  • 上面的代码是一个假设的示例,因为fl_query并不是一个广为人知的Flutter插件。实际使用时,你需要参考fl_query(或你实际使用的插件)的官方文档。
  • 如果fl_query不存在,你可能想使用的是sqflite插件。对于sqflite,你可以参考其官方文档来获取详细的用法和示例。
  • 在使用任何数据库插件时,确保正确管理数据库连接的生命周期,例如在组件销毁时关闭数据库连接。
回到顶部