Flutter网络核心功能插件network_core的使用

Flutter网络核心功能插件network_core的使用

Network Core - Flutter插件

Network Core 是一个基于 Flutter 的插件,它简化了网络操作,使用了 Dio HTTP 客户端。它提供了一个干净且可扩展的架构来处理网络请求、解析响应以及管理 API 配置。

特性

  • 使用简单的 NetworkClient 处理请求。
  • 可扩展的 NetworkConfiguration 来自定义客户端设置。
  • 简化请求和响应解析,通过 RequestApiEntityParser
  • 内置支持依赖注入和模块化架构。

安装

在你的 pubspec.yaml 文件中添加该插件:

dependencies:
  network_core: ^0.0.3

示例代码

以下是一个完整的示例代码,展示了如何使用 network_core 插件进行网络请求。

main.dart

import 'package:example/app/app.dart'; // 导入应用入口
import 'package:example/modules/posts/posts.provider.dart'; // 导入数据提供者
import 'package:flutter/material.dart'; // 导入 Flutter 基础库
import 'package:provider/provider.dart'; // 导入状态管理库

void main() {
  // 在应用启动时初始化多提供商
  runApp(MultiProvider(
    providers: [
      // 创建并初始化 PostProvider 实例,并调用 getPosts 方法获取数据
      ChangeNotifierProvider(create: (_) => PostProvider()..getPosts()),
    ],
    // 设置应用根组件
    child: const MyApp(),
  ));
}

app.dart

import 'package:flutter/material.dart'; // 导入 Flutter 基础库

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

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

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    // 获取 PostProvider 实例
    final postProvider = Provider.of<PostProvider>(context);
    
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                // 调用 PostProvider 的方法刷新数据
                postProvider.getPosts();
              },
              child: Text('Refresh Posts'),
            ),
            // 显示从 PostProvider 中获取的数据
            ...postProvider.posts.map((post) => Text(post.title)).toList()
          ],
        ),
      ),
    );
  }
}

posts.provider.dart

import 'package:dio/dio.dart'; // 导入 Dio 库
import 'package:network_core/network_core.dart'; // 导入 Network Core 库
import 'package:flutter/foundation.dart'; // 导入 Flutter 基础库

class Post {
  final int userId;
  final int id;
  final String title;
  final String body;

  Post({
    required this.userId,
    required this.id,
    required this.title,
    required this.body,
  });

  factory Post.fromJson(Map<String, dynamic> json) {
    return Post(
      userId: json['userId'],
      id: json['id'],
      title: json['title'],
      body: json['body'],
    );
  }
}

class PostProvider with ChangeNotifier {
  List<Post> _posts = [];

  List<Post> get posts => _posts;

  Future<void> getPosts() async {
    try {
      // 使用 NetworkClient 发送请求
      final response = await NetworkClient().get('/posts');
      
      if (response.statusCode == 200) {
        // 解析响应数据
        final data = response.data as List<dynamic>;
        _posts = data.map((json) => Post.fromJson(json)).toList();
        notifyListeners(); // 通知监听器更新视图
      } else {
        throw Exception('Failed to load posts');
      }
    } catch (e) {
      print(e);
    }
  }
}

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

1 回复

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


network_core 是一个用于 Flutter 的网络核心功能插件,它可以帮助开发者更方便地处理网络请求、缓存、拦截器等常见的网络操作。以下是如何使用 network_core 插件的基本指南。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 network_core 依赖:

dependencies:
  flutter:
    sdk: flutter
  network_core: ^0.1.0 # 请根据实际情况使用最新版本

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

2. 初始化网络客户端

在使用 network_core 之前,你需要初始化一个网络客户端。你可以通过 NetworkClient 类来创建一个客户端实例。

import 'package:network_core/network_core.dart';

final networkClient = NetworkClient(
  baseUrl: 'https://api.example.com', // 你的 API 基础 URL
  interceptors: [
    // 可以添加拦截器,例如日志拦截器、认证拦截器等
    LoggingInterceptor(),
  ],
);

3. 发送 GET 请求

你可以使用 networkClient.get 方法来发送 GET 请求:

Future<void> fetchData() async {
  try {
    final response = await networkClient.get('/endpoint');
    print('Response data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

4. 发送 POST 请求

你可以使用 networkClient.post 方法来发送 POST 请求:

Future<void> postData() async {
  try {
    final response = await networkClient.post(
      '/endpoint',
      data: {'key': 'value'}, // 请求体数据
    );
    print('Response data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

5. 使用拦截器

network_core 支持拦截器,你可以在请求发送前或响应接收后进行处理。例如,添加一个日志拦截器:

class LoggingInterceptor extends Interceptor {
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    print('Request: ${options.method} ${options.uri}');
    super.onRequest(options, handler);
  }

  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    print('Response: ${response.statusCode}');
    super.onResponse(response, handler);
  }

  @override
  void onError(DioError err, ErrorInterceptorHandler handler) {
    print('Error: ${err.message}');
    super.onError(err, handler);
  }
}

然后在初始化 NetworkClient 时添加这个拦截器:

final networkClient = NetworkClient(
  baseUrl: 'https://api.example.com',
  interceptors: [LoggingInterceptor()],
);

6. 处理错误

network_core 使用 Dio 作为底层网络库,因此你可以使用 DioError 来处理错误:

Future<void> fetchData() async {
  try {
    final response = await networkClient.get('/endpoint');
    print('Response data: ${response.data}');
  } on DioError catch (e) {
    print('DioError: ${e.message}');
  } catch (e) {
    print('Error: $e');
  }
}

7. 设置请求头

你可以通过 options 参数来设置请求头:

Future<void> fetchDataWithHeaders() async {
  try {
    final response = await networkClient.get(
      '/endpoint',
      options: Options(headers: {'Authorization': 'Bearer token'}),
    );
    print('Response data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}
回到顶部