Flutter网络请求插件flutter_cpnetworking_service的使用

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

Flutter网络请求插件flutter_cpnetworking_service的使用

flutter_cpnetworking_service 是一个网络请求封装库,它使用 dio 来处理 HTTP 请求,并利用 flutter_secure_storage(在 iOS 和 Android 平台上)或 shared_preferences(在 Web 平台上)来存储令牌或其他敏感数据。该库还允许将令牌用作 HTTP 请求中的授权信息。

使用

我们将使用一个随机新闻 API,该 API 生成新闻数据并以 JSON 格式返回。

基本新闻模型

class NewsEnity implements BaseModelInterface {
  final String title;
  final String id;
  final String description;
  final List<String> categories;
  final List<String> medias;
  final int published;

  String formattedPublished(String languageCode) {
    var date = DateTime.fromMillisecondsSinceEpoch(published);
    var formattedDate = DateFormat.yMMMMd(languageCode).format(date);
    return formattedDate;
  }

  NewsEnity({
    @required this.title,
    @required this.id,
    @required this.description,
    @required this.medias,
    @required this.categories,
    @required this.published
  });

  factory NewsEnity.fromJson(Map<String, dynamic> json) {
    List<String> category;
    if (json['category'] is String) {
      category = [json['category'].toString()];
    }
    return NewsEnity(
      title: json['title'],
      id: json['id'],
      description: json['description'],
      categories: category ??
          (json['category'] as List).map((e) => e.toString()).toList() ??
          [],
      medias: (json['medias'] as List).map((e) => e.toString()).toList() ?? [],
      published: json['published']
    );
  }

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

仓库

仓库抽象类将介于我们的架构中的高层组件之间(如 Bloc 和客户端 API 提供程序)。

abstract class NewsRepository {
  Future<ResponseListData<NewsEnity>> fetchHotNews();
  Future<ResponseListData<NewsEnity>> fetchLocalNews();
}

enum _Path { Hot, Local }

class _URLPathHelper {
  static String value(_Path value) {
    switch (value) {
      case _Path.Hot:
        return '/application/news/hot';
      case _Path.Local:
        return '/application/news/local';
      default:
        return '';
    }
  }
}

class NewsClient extends APIProvider implements NewsRepository {
  [@override](/user/override)
  Future<ResponseListData<NewsEnity>> fetchHotNews() async {
    var input = DefaultInputService(path: _URLPathHelper.value(_Path.Local));
    final response = await super.request(input: input);
    var result = (response.data['data'] as List)
        .map((e) => NewsEnity.fromJson(e))
        .toList();
    return ResponseListData<NewsEnity>(() => result);
  }

  [@override](/user/override)
  Future<ResponseListData<NewsEnity>> fetchLocalNews() {
    return Future.error(AppError(message: ''));
  }

  NewsClient({
    @required StorageTokenProcessor storageTokenProcessor,
    @required NetworkConfigurable networkConfigurable,
    Interceptor interceptor
  }) : super(
    storageTokenProcessor: storageTokenProcessor,
    networkConfiguration: networkConfigurable,
    interceptor: interceptor
  );
}

Bloc

让我们添加架构中的高层组件之一,即 Bloc(业务逻辑组件)。NewsBloc 是唯一可以从 UI 类中使用的组件(在清洁架构的术语中)。NewsBloc 从仓库获取数据并通过状态通知。

class NewsBloc extends Bloc<NewsEvent, NewsState> {
  final NewsRepository newsRepository;
  final StorageTokenProcessor storageTokenProcessor;

  NewsBloc({
    @required this.newsRepository,
    @required this.storageTokenProcessor
  }) : super(NewsInitial());

  [@override](/user/override)
  Stream<NewsState> mapEventToState(NewsEvent event) async* {
    if (event is FetchNews) {
      yield NewsLoading();
      yield* _fetchNews(event);
    }
  }

  Stream<NewsState> _fetchNews(FetchNews params) async* {
    try {
      var localNews = await newsRepository.fetchHotNews();
      yield NewsLoaded(hotNews: [], localNews: localNews.data);
    } on AppError catch (e, stack) {
      yield NewsError(message: e.message);
    }
  }
}

[@immutable](/user/immutable)
abstract class NewsEvent {}

class FetchNews extends NewsEvent {}

[@immutable](/user/immutable)
abstract class NewsState {}

class NewsLoaded extends NewsState {
  final List<NewsEnity> hotNews;
  final List<NewsEnity> localNews;

  NewsLoaded({
    @required this.hotNews,
    @required this.localNews,
  });
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter网络请求插件flutter_cpnetworking_service的代码案例。请注意,由于这个插件可能不是官方或广泛认可的插件,因此代码可能需要根据实际的插件API进行调整。不过,这里我将提供一个假设性的示例,展示如何使用一个类似的网络请求插件。

首先,确保你已经在pubspec.yaml文件中添加了该插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_cpnetworking_service: ^最新版本号 # 请替换为实际版本号

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

接下来,你可以在Dart代码中导入并使用该插件进行网络请求。以下是一个简单的示例,展示如何发送GET和POST请求:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter CPNetworking Service Example'),
        ),
        body: Center(
          child: NetworkRequestExample(),
        ),
      ),
    );
  }
}

class NetworkRequestExample extends StatefulWidget {
  @override
  _NetworkRequestExampleState createState() => _NetworkRequestExampleState();
}

class _NetworkRequestExampleState extends State<NetworkRequestExample> {
  String? responseData;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: () async {
            String result = await sendGetRequest();
            setState(() {
              responseData = result;
            });
          },
          child: Text('Send GET Request'),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () async {
            String result = await sendPostRequest();
            setState(() {
              responseData = result;
            });
          },
          child: Text('Send POST Request'),
        ),
        SizedBox(height: 20),
        Text(responseData ?? 'No response yet'),
      ],
    );
  }

  Future<String> sendGetRequest() async {
    // 假设插件提供了一个名为CPNetworkingService的类
    CPNetworkingService networkingService = CPNetworkingService();
    
    // 配置请求参数
    Map<String, String> headers = {
      'Content-Type': 'application/json',
    };
    
    // 发送GET请求
    var response = await networkingService.get(
      url: 'https://api.example.com/data', // 替换为实际的API URL
      headers: headers,
    );
    
    // 假设response.data包含服务器返回的JSON数据
    return response.data.toString();
  }

  Future<String> sendPostRequest() async {
    CPNetworkingService networkingService = CPNetworkingService();
    
    // 配置请求参数
    Map<String, String> headers = {
      'Content-Type': 'application/json',
    };
    Map<String, String> body = {
      'key1': 'value1',
      'key2': 'value2',
    };
    
    // 发送POST请求
    var response = await networkingService.post(
      url: 'https://api.example.com/data', // 替换为实际的API URL
      headers: headers,
      body: body,
    );
    
    // 假设response.data包含服务器返回的JSON数据
    return response.data.toString();
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中有两个按钮,分别用于发送GET和POST请求。这些请求通过CPNetworkingService类(这是假设的插件提供的类)发送,并假设该类具有getpost方法。

请注意,由于flutter_cpnetworking_service可能不是实际存在的插件,上述代码中的类名和方法可能需要根据实际插件的API进行调整。在实际使用时,请查阅该插件的官方文档以获取准确的API信息。

回到顶部