Flutter网络请求增强插件networking_plus的使用

Flutter网络请求增强插件networking_plus的使用

Networking Plus

一个用于轻松调用REST API并摆脱大量样板代码的Flutter库。

特性

  1. GET 请求
  2. POST 请求
  3. PUT 请求
  4. DELETE 请求

开始使用

要使用此网络工具,只需调用库的静态函数即可,您可以非常方便地调用您的REST API。此库中的错误处理非常简单,它会以字符串的形式为您提供确切的错误信息,因此您可以将其展示在UI上供用户参考。

使用方法

首先,通过以下代码设置库中的基础URL:

Networking.baseURL = "https://example.com/api/v1/"

此外,您还可以设置默认头信息,这些头信息将会附加到每次API调用中。

Networking.defaultHeaders["Content-Type"] = "application/json";
Networking.defaultHeaders["Authorization"] = "Bearer ${UserRepo.getToken()}";

现在可以像下面的例子一样调用库中的任何方法:

var result = await Networking.get("user/data");

结果有两种类型:SuccessError

如果是成功响应,可以从结果中获取数据如下:

if(result is Success) {
    var body = result.response;
    
    // 如果响应是一个对象
    var desiredObject = MyObject.fromJson(body);
    
    // 如果响应是一个对象列表
    var resultList = result.response as List;
    var itemList: List<MyObject> = resultList.map((e) => MyObject.fromJson(e)).toList();
} 

如果是错误响应,则可以这样处理:

else {
    var error = result as Error;
    var errorCode = error.code;
    var errorMessage = error.message;
}

额外信息

这些功能将很快成为库的一部分:

  1. 调用超时
  2. 从未经验证的颁发机构进行SSL证书验证

完整示例代码

以下是一个完整的示例代码,展示了如何使用 networking_plus 插件来处理网络请求。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: NetworkExample(),
    );
  }
}

class NetworkExample extends StatefulWidget {
  @override
  _NetworkExampleState createState() => _NetworkExampleState();
}

class _NetworkExampleState extends State<NetworkExample> {
  String _result = "";

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

  Future<void> fetchData() async {
    // 设置基础URL和默认头信息
    Networking.baseURL = "https://jsonplaceholder.typicode.com/";
    Networking.defaultHeaders["Content-Type"] = "application/json";

    try {
      // 发起GET请求
      var result = await Networking.get("posts/1");

      if (result is Success) {
        // 处理成功响应
        var body = result.response;
        setState(() {
          _result = "成功: $body";
        });
      } else if (result is Error) {
        // 处理错误响应
        setState(() {
          _result = "错误: ${result.code} - ${result.message}";
        });
      }
    } catch (e) {
      // 捕获异常
      setState(() {
        _result = "异常: $e";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("networking_plus 示例")),
      body: Center(
        child: Text(_result),
      ),
    );
  }
}

运行效果

运行上述代码后,界面会显示从 https://jsonplaceholder.typicode.com/posts/1 获取的数据。如果请求成功,界面会显示类似以下内容:

成功: {"userId":1,"id":1,"title":"sunt aut facere repellat provident occaecati excepturi optio reprehenderit","body":"quia et suscipit\nsuscipit ...

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

1 回复

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


networking_plus 是 Flutter 中一个用于增强网络请求的插件,它提供了更多的功能和灵活性来处理 HTTP 请求。以下是如何使用 networking_plus 插件的基本步骤:

1. 添加依赖

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

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

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

2. 导入包

在你的 Dart 文件中导入 networking_plus 包:

import 'package:networking_plus/networking_plus.dart';

3. 发起网络请求

networking_plus 提供了多种方法来发起网络请求,包括 GETPOSTPUTDELETE 等。

3.1 GET 请求

void fetchData() async {
  var response = await Networking.get('https://jsonplaceholder.typicode.com/posts');
  if (response.statusCode == 200) {
    print('Data: ${response.body}');
  } else {
    print('Request failed with status: ${response.statusCode}');
  }
}

3.2 POST 请求

void postData() async {
  var response = await Networking.post(
    'https://jsonplaceholder.typicode.com/posts',
    body: {
      'title': 'foo',
      'body': 'bar',
      'userId': 1,
    },
  );
  if (response.statusCode == 201) {
    print('Data: ${response.body}');
  } else {
    print('Request failed with status: ${response.statusCode}');
  }
}

4. 处理请求头

你可以在请求中添加自定义的请求头:

void fetchDataWithHeaders() async {
  var response = await Networking.get(
    'https://jsonplaceholder.typicode.com/posts',
    headers: {
      'Authorization': 'Bearer your_token_here',
    },
  );
  if (response.statusCode == 200) {
    print('Data: ${response.body}');
  } else {
    print('Request failed with status: ${response.statusCode}');
  }
}

5. 处理错误

networking_plus 提供了错误处理机制,你可以通过 try-catch 来捕获异常:

void fetchDataWithErrorHandling() async {
  try {
    var response = await Networking.get('https://jsonplaceholder.typicode.com/invalid');
    if (response.statusCode == 200) {
      print('Data: ${response.body}');
    } else {
      print('Request failed with status: ${response.statusCode}');
    }
  } catch (e) {
    print('Error: $e');
  }
}

6. 处理响应

你可以通过 response.body 来获取响应的主体内容,或者通过 response.json() 来将响应内容解析为 JSON 对象:

void fetchAndParseJson() async {
  var response = await Networking.get('https://jsonplaceholder.typicode.com/posts');
  if (response.statusCode == 200) {
    var jsonData = response.json();
    print('First post title: ${jsonData[0]['title']}');
  } else {
    print('Request failed with status: ${response.statusCode}');
  }
}

7. 其他功能

networking_plus 还提供了其他功能,如文件上传、下载、请求超时设置等。你可以参考官方文档来了解更多高级用法。

8. 示例代码

以下是一个完整的示例代码,展示了如何使用 networking_plus 发起一个 GET 请求并处理响应:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Networking Plus Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: fetchData,
            child: Text('Fetch Data'),
          ),
        ),
      ),
    );
  }

  void fetchData() async {
    try {
      var response = await Networking.get('https://jsonplaceholder.typicode.com/posts');
      if (response.statusCode == 200) {
        var jsonData = response.json();
        print('First post title: ${jsonData[0]['title']}');
      } else {
        print('Request failed with status: ${response.statusCode}');
      }
    } catch (e) {
      print('Error: $e');
    }
  }
}
回到顶部