Flutter网络功能增强插件remedi_net的使用

简介

remedi_net 是一个基于 dio 的网络请求封装库。它提供了更简洁的方式来处理 HTTP 请求,并支持自定义错误处理和数据解析逻辑。


如何使用remedi_net

1. 实现 ApiService

首先,我们需要继承 ApiService 并实现具体的 API 方法。以下是一个示例:

import 'package:remedi_net/remedi_net.dart';

class GoogleApiService extends ApiService<GoogleData> {
  GoogleApiService()
      : super(
          request: DioRequest(
            builder: DioBuilder.json(
              baseUrl: 'https://www.googleapis.com',
            ),
          ),
        );

  /// 定义一个 GET 请求方法
  Future<dynamic> get() async {
    return requestGet(
      path: '/books/v1/volumes',
      queries: {'q': '{http}'},
    );
  }

  /// 自定义 JSON 数据解析逻辑
  [@override](/user/override)
  GoogleData? onSuccess({int? statusCode, dynamic json}) {
    return GoogleData.fromJson(json);
  }

  /// 自定义错误处理逻辑
  [@override](/user/override)
  HttpError onError(HttpError error) {
    // TODO: 可以根据业务需求自定义错误处理逻辑
    return super.onError(error);
  }
}

/// 定义数据模型类
class GoogleData extends IDto {
  GoogleData();

  /// 将 JSON 数据解析为对象
  static GoogleData? fromJson(Map<String, dynamic> json) {
    return GoogleData();
  }

  /// 将对象序列化为 JSON
  [@override](/user/override)
  Map<String, dynamic> get toJson => {};
}

2. 使用 API

在实现好 ApiService 后,我们可以通过调用其方法来发起网络请求,并处理返回的结果。以下是一个完整的示例代码:

import 'dart:developer' as dev;

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

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

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

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

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  dynamic _response;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("TEST"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () async {
                // 调用网络请求方法
                final response = await getGoogle();
                setState(() {
                  _response = response;
                });
              },
              child: const Text('获取数据'),
            ),
            const SizedBox(height: 20),
            Text(
              _response is GoogleData
                  ? (_response as GoogleData).toJson.toString()
                  : _response.toString(),
              textAlign: TextAlign.center,
            ),
          ],
        ),
      ),
    );
  }

  Future<dynamic> getGoogle() async {
    try {
      final result = await GoogleApiService().get();
      if (result is GoogleData) {
        dev.log(result.toJson.toString(), name: 'getGoogle');
        return result;
      } else if (result is HttpError) {
        throw result;
      }
    } catch (e) {
      dev.log(e.toString(), name: 'getGoogle');
      rethrow;
    }
    return null;
  }
}

示例代码说明

以下是从官方示例代码中提取的部分,展示如何通过 remedi_net 发起网络请求并处理响应:

class GoogleApiService extends ApiService<GoogleData> {
  GoogleApiService()
      : super(
          request: DioRequest(
            builder: DioBuilder.json(
              baseUrl: 'https://www.googleapis.com',
            ),
          ),
        );

  Future<dynamic> get() async {
    return requestGet(
      path: '/books/v1/volumes',
      queries: {'q': '{http}'},
    );
  }

  [@override](/user/override)
  GoogleData? onSuccess({int? statusCode, dynamic json}) {
    return GoogleData.fromJson(json);
  }

  [@override](/user/override)
  HttpError onError(HttpError error) {
    // 自定义错误处理逻辑
    return super.onError(error);
  }
}

class GoogleData extends IDto {
  GoogleData();

  static GoogleData? fromJson(Map<String, dynamic> json) {
    return GoogleData();
  }

  [@override](/user/override)
  Map<String, dynamic> get toJson => {};
}

更多关于Flutter网络功能增强插件remedi_net的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络功能增强插件remedi_net的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


remedi_net 是一个用于增强 Flutter 应用网络功能的插件。它提供了一些便捷的功能,如网络请求、缓存管理、错误处理等,以简化开发者在 Flutter 应用中进行网络操作的过程。以下是如何使用 remedi_net 插件的基本步骤和示例。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 remedi_net 插件的依赖。

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

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

2. 初始化插件

在你的 Flutter 应用中初始化 remedi_net 插件。通常可以在 main.dart 文件中进行初始化。

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Remedinet.init();  // 初始化插件
  runApp(MyApp());
}

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

3. 发起网络请求

remedi_net 提供了简单的方法来发起网络请求。以下是一个 GET 请求的示例:

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _responseData = '';

  Future<void> _fetchData() async {
    try {
      final response = await Remedinet.get('https://jsonplaceholder.typicode.com/posts');
      setState(() {
        _responseData = response.data.toString();
      });
    } catch (e) {
      setState(() {
        _responseData = 'Error: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('RemediNet Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _fetchData,
              child: Text('Fetch Data'),
            ),
            SizedBox(height: 20),
            Expanded(
              child: SingleChildScrollView(
                child: Text(_responseData),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

4. 处理 POST 请求

remedi_net 也支持 POST 请求。以下是一个 POST 请求的示例:

Future<void> _postData() async {
  try {
    final response = await Remedinet.post(
      'https://jsonplaceholder.typicode.com/posts',
      data: {
        'title': 'foo',
        'body': 'bar',
        'userId': 1,
      },
    );
    setState(() {
      _responseData = response.data.toString();
    });
  } catch (e) {
    setState(() {
      _responseData = 'Error: $e';
    });
  }
}

5. 错误处理

remedi_net 提供了内置的错误处理机制。你可以通过捕获异常来处理网络请求中的错误。

try {
  final response = await Remedinet.get('https://jsonplaceholder.typicode.com/invalid-url');
  setState(() {
    _responseData = response.data.toString();
  });
} catch (e) {
  setState(() {
    _responseData = 'Error: $e';
  });
}

6. 缓存管理

remedi_net 还支持缓存管理。你可以通过配置缓存策略来控制网络请求的缓存行为。

final response = await Remedinet.get(
  'https://jsonplaceholder.typicode.com/posts',
  cachePolicy: CachePolicy.cacheFirst,  // 使用缓存优先策略
);

7. 其他功能

remedi_net 还提供了其他一些功能,如请求拦截器、响应拦截器、超时设置等。你可以根据需要进行配置。

Remedinet.init(
  interceptors: [
    (request) {
      // 请求拦截器
      request.headers['Authorization'] = 'Bearer token';
      return request;
    },
  ],
  timeout: Duration(seconds: 10),  // 设置超时时间
);
回到顶部