Flutter网络数据查询插件fl_rest_query的使用

Flutter网络数据查询插件fl_rest_query的使用

开始使用

在您的依赖项中添加fl_rest_queryfl_query

使用方法

第一步:创建HTTP基础查询

例如,我们可以使用dio来创建HTTP基础查询。

import 'package:fl_rest_query/fl_rest_query.dart';
import 'package:dio/dio.dart' as dio;
import 'package:flutter/material.dart';

class HttpDio implements HttpBaseQuery {
  late final dio.Dio req;

  final BuildContext context;

  HttpDio(this.context, {dio.Dio? dioOverride}) {
    req = dioOverride ??
        dio.Dio(
            dio.BaseOptions(baseUrl: 'https://jsonplaceholder.typicode.com'));
  }

  [@override](/user/override)
  performMutation<T extends RestBaseQueryParams, DataType, Response>(
      params, data) async {
    var response = await req.request(params.url,
        data: data,
        queryParameters: params.params, onSendProgress: (received, total) {
    },
        options: dio.Options(
          headers: params.headers,
          method: params.method.name,
        ));
    return response.data;
  }

  [@override](/user/override)
  performQuery<T extends RestBaseQueryParams, Response>(params) async {
    var response = await req.request(params.url, queryParameters: params.params,
        onReceiveProgress: (received, total) {
    },
        options: dio.Options(
          headers: params.headers,
          method: params.method.name,
        ));
    return response.data as Response;
  }
}

第二步:初始化配置

main.dart文件中初始化配置。

import 'package:example/page.dart';
import 'package:fl_query/fl_query.dart';
import 'package:fl_rest_query/fl_rest_query.dart';
import 'package:flutter/material.dart';

import 'http_dio.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return RestQueryClientProvider(
      baseQuery: HttpDio(context), // 使用自定义的HttpDio作为基础查询
      client: QueryClient(),
      child: MaterialApp(
        title: 'Rest Query',
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
            useMaterial3: true,
            primarySwatch: Colors.cyan,
            primaryColor: Colors.cyan),
        home: const HomePage(),
      ),
    );
  }
}

第三步:在代码中使用restMutationBuilder和RestQueryBuilder

import 'package:fl_query/fl_query.dart';
import 'package:fl_rest_query/fl_rest_query.dart';
import 'package:flutter/material.dart';

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            RestQueryBuilder(
              context: context,
              params: RestBaseQueryParams(
                  method: Method.GET, tag: 'GET-POST', url: '/posts'),
              builder: (context, Query query) {
                if (query.isLoading) {
                  return const CupertinoActivityIndicator();
                }

                if (query.hasError) {
                  return Text(query.error.toString());
                }
                // 日志记录 query.data
                return RestMutationBuilder(
                    context: context,
                    params: RestBaseQueryParams(
                        method: Method.POST, tag: 'ADD-POST', url: '/posts'),
                    onData: (data, d) {
                      // 日志记录 data
                    },
                    builder: (context, mutation) {
                      return ElevatedButton(
                          onPressed: () {
                            mutation.mutate({
                              "title": 'foo',
                              "body": 'bar',
                              "userId": 1,
                            });
                          },
                          child: const Text('Add Post'));
                    });
              },
            )
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


fl_rest_query 是一个用于 Flutter 的插件,旨在简化与 RESTful API 的交互。它提供了一种简单的方式来发送 HTTP 请求并处理响应。以下是如何使用 fl_rest_query 插件的基本步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 fl_rest_query 依赖:

dependencies:
  flutter:
    sdk: flutter
  fl_rest_query: ^1.0.0  # 请使用最新版本

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

2. 基本用法

初始化

在使用 fl_rest_query 之前,你需要初始化它。通常你可以在 main.dart 中进行初始化:

import 'package:fl_rest_query/fl_rest_query.dart';

void main() {
  // 初始化 FlRestQuery
  FlRestQuery.initialize(
    baseUrl: 'https://jsonplaceholder.typicode.com', // 你的 API 基础 URL
    defaultHeaders: {
      'Content-Type': 'application/json',
    },
  );

  runApp(MyApp());
}

发送 GET 请求

你可以使用 FlRestQuery 来发送 GET 请求:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('FlRestQuery Example'),
        ),
        body: FutureBuilder(
          future: FlRestQuery.get('/posts'), // 发送 GET 请求
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(child: CircularProgressIndicator());
            } else if (snapshot.hasError) {
              return Center(child: Text('Error: ${snapshot.error}'));
            } else {
              var data = snapshot.data;
              return ListView.builder(
                itemCount: data.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text(data[index]['title']),
                    subtitle: Text(data[index]['body']),
                  );
                },
              );
            }
          },
        ),
      ),
    );
  }
}

发送 POST 请求

发送 POST 请求也很简单:

Future<void> createPost() async {
  var response = await FlRestQuery.post(
    '/posts',
    body: {
      'title': 'foo',
      'body': 'bar',
      'userId': 1,
    },
  );

  print('Created post: ${response['id']}');
}

处理错误

你可以通过捕获异常来处理错误:

try {
  var response = await FlRestQuery.get('/nonexistent');
} catch (e) {
  print('Error: $e');
}

3. 高级用法

fl_rest_query 还支持其他 HTTP 方法(如 PUT、DELETE 等),以及更多的自定义选项,比如设置超时、自定义头等。

发送 PUT 请求

Future<void> updatePost(int postId) async {
  var response = await FlRestQuery.put(
    '/posts/$postId',
    body: {
      'title': 'updated title',
      'body': 'updated body',
      'userId': 1,
    },
  );

  print('Updated post: $response');
}

发送 DELETE 请求

Future<void> deletePost(int postId) async {
  await FlRestQuery.delete('/posts/$postId');
  print('Post deleted');
}

4. 自定义配置

你可以在初始化时或每次请求时自定义配置:

FlRestQuery.initialize(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  defaultHeaders: {
    'Content-Type': 'application/json',
  },
  timeout: Duration(seconds: 10), // 设置超时时间
);

或者在单个请求中覆盖默认配置:

var response = await FlRestQuery.get(
  '/posts',
  headers: {
    'Authorization': 'Bearer your_token',
  },
  timeout: Duration(seconds: 5),
);
回到顶部