Flutter异常处理插件api_exception_handler的使用

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

Flutter异常处理插件api_exception_handler的使用

引言

API Exception Handler 是一个用于处理 HTTP 请求异常的高级错误处理器。它可以帮助你更好地管理和展示请求过程中可能出现的各种错误。

开始使用

添加依赖

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

dependencies:
  api_exception_handler: ^0.0.3

然后运行 flutter pub get 来获取该依赖包。

简单使用

下面是一个简单的示例,展示了如何使用 api_exception_handler 插件来处理网络请求并展示不同的屏幕状态(加载中、成功、失败等)。

示例代码

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:api_exception_handler/api_exception_handler.dart';

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

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 HomeScreen(),
    );
  }
}

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

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('API Response Handler'),
      ),
      body: APIResponseHandler(
        /// 这个函数将作为异步函数行为
        function: [fetchData()],

        /// 自定义成功屏幕
        successScreen: (data) {
          return Text(data!.data[0].toString());
        },

        /// 自定义错误屏幕
        errorScreen: (data) {
          return SizedBox(
            width: MediaQuery.of(context).size.width,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text(data.toString()),
                const SizedBox(
                  height: 20,
                ),
                InkWell(
                  onTap: () {
                    /// 只需调用 setState(() {}) 即可刷新数据。
                    setState(() {});
                  },
                  child: Container(
                    decoration: BoxDecoration(
                      color: Colors.blueAccent,
                      borderRadius: BorderRadius.circular(10),
                    ),
                    padding:
                        const EdgeInsets.symmetric(vertical: 8, horizontal: 20),
                    child: const Text(
                      'Retry',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ],
            ),
          );
        },

        /// 自定义网络错误屏幕
        networkErrorScreen:
            const Text('无法与服务器建立连接!!'),

        /// 自定义加载屏幕
        loadingScreen: const Center(
          child: CupertinoActivityIndicator(
            radius: 20,
          ),
        ),
      ),
    );
  }
}

/// 获取数据的异步函数
Future fetchData() async {
  String url = 'https://api.covid19api.com/summary/';

  final parameters = {
    '': '',
  };

  var response = await ApiHandler().get(url: url, queryParameters: parameters);
  var data = json.decode(response);

  return data;
}

使用 FutureBuilder

除了使用 APIResponseHandler,你还可以直接使用 FutureBuilder 来实现类似的功能:

FutureBuilder(
  future: fetchData(),
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    if (snapshot.hasData) {
      /// 处理成功返回的数据
      return Text(snapshot.data.toString());
    } else if (snapshot.hasError) {
      /// 处理错误
      return Text('Error: ${snapshot.error}');
    } else if (snapshot.connectionState == ConnectionState.waiting) {
      /// 显示加载状态
      return const Center(
        child: CupertinoActivityIndicator(radius: 18),
      );
    } else if (snapshot.connectionState == ConnectionState.none) {
      /// 其他状态
      return Text('No connection');
    }
    return const Center(child: CupertinoActivityIndicator(radius: 18));
  },
)

更多关于Flutter异常处理插件api_exception_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter异常处理插件api_exception_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用api_exception_handler插件来处理异常的代码示例。api_exception_handler是一个帮助开发者集中处理API异常的插件,能够简化错误处理流程并提供一致的错误用户体验。

1. 添加依赖

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

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

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

2. 配置api_exception_handler

在你的Flutter应用的主入口文件(通常是main.dart)中配置api_exception_handler。以下是一个基本的配置示例:

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

void main() {
  // 初始化ExceptionHandler
  ExceptionHandler.initialize(
    onError: (context, exception) {
      // 自定义错误处理逻辑
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text('发生错误: ${exception.message}'),
          backgroundColor: Colors.red,
        ),
      );
    },
    onApiException: (context, apiException) {
      // 自定义API错误处理逻辑
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text('API错误: ${apiException.statusCode} - ${apiException.message}'),
          backgroundColor: Colors.amber,
        ),
      );
    },
  );

  runApp(MyApp());
}

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            try {
              // 模拟API调用
              await fetchData();
            } catch (e) {
              // 使用ExceptionHandler处理异常
              ExceptionHandler.handleError(context, e);
            }
          },
          child: Text('Fetch Data'),
        ),
      ),
    );
  }

  Future<void> fetchData() async {
    // 这里可以放置实际的API调用代码
    // 例如: http.get(Uri.parse('https://api.example.com/data'))
    throw ApiException(statusCode: 404, message: 'Not Found', details: 'Resource not found');
  }
}

// 自定义ApiException类,模拟API错误
class ApiException implements Exception {
  final int statusCode;
  final String message;
  final String? details;

  ApiException({required this.statusCode, required this.message, this.details});
}

3. 使用ExceptionHandler处理异常

在上面的代码中,我们定义了一个ApiException类来模拟API错误,并在fetchData函数中抛出这个异常。在按钮的onPressed回调中,我们使用try-catch块来捕获异常,并通过ExceptionHandler.handleError方法处理异常。

4. 自定义错误消息

ExceptionHandler.initialize方法中,我们定义了onErroronApiException两个回调函数,分别用于处理一般异常和API异常。你可以根据自己的需求自定义这些回调函数中的错误处理逻辑,比如显示不同的SnackBar或者导航到错误页面。

这个示例展示了如何使用api_exception_handler插件来集中处理Flutter应用中的异常,希望对你有所帮助。如果你有更具体的需求或问题,欢迎继续提问!

回到顶部