Flutter可取消请求插件cancellable_requester的使用

Flutter可取消请求插件cancellable_requester的使用

在开发过程中,我们经常会遇到需要取消网络请求的情况。为了满足这一需求,可以使用cancellable_requester插件来管理可取消的网络请求。下面将详细介绍如何在Flutter项目中使用该插件。

示例代码

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

dependencies:
  flutter:
    sdk: flutter
  dio: ^5.0.0  # 请根据实际情况选择合适的版本
  cancellable_requester: ^1.0.0  # 请根据实际情况选择合适的版本

然后,运行flutter pub get以安装这些依赖。

接下来,我们将展示如何在Flutter应用中使用cancellable_requester插件来发起一个可取消的网络请求,并展示如何取消它。

示例代码文件:example/lib/main.dart

import 'package:cancellable_requester/cancellable_requester.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个小部件是你的应用程序的根。
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '你已经点击了按钮次数:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          var dio = Dio(
              BaseOptions(baseUrl: "https://jsonplaceholder.typicode.com/"));
          var res = dio.getCancellable("todos");
          print(RequestCancellable.tokens.length);
          var response = await res.response;
          print("response : ${response.data}");
          print(RequestCancellable.tokens.length);

          // 取消所有带有特定路径的请求
          RequestCancellable.cancellAll((token) => token.path == "todos");
        },
        tooltip: '增加',
        child: const Icon(Icons.add),
      ),
    );
  }
}

代码解释

  1. 导入依赖

    import 'package:cancellable_requester/cancellable_requester.dart';
    import 'package:dio/dio.dart';
    import 'package:flutter/material.dart';
    
  2. 定义主应用

    void main() {
      runApp(const MyApp());
    }
    
  3. 创建主页面

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
            useMaterial3: true,
          ),
          home: const MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
  4. 创建首页

    class MyHomePage extends StatefulWidget {
      const MyHomePage({super.key, required this.title});
    
      final String title;
    
      @override
      State<MyHomePage> createState() => _MyHomePageState();
    }
    
  5. 定义状态类

    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            backgroundColor: Theme.of(context).colorScheme.inversePrimary,
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                const Text(
                  '你已经点击了按钮次数:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.headlineMedium,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () async {
              var dio = Dio(
                  BaseOptions(baseUrl: "https://jsonplaceholder.typicode.com/"));
              var res = dio.getCancellable("todos");
              print(RequestCancellable.tokens.length);
              var response = await res.response;
              print("response : ${response.data}");
              print(RequestCancellable.tokens.length);
    
              // 取消所有带有特定路径的请求
              RequestCancellable.cancellAll((token) => token.path == "todos");
            },
            tooltip: '增加',
            child: const Icon(Icons.add),
          ),
        );
      }
    }
    

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

1 回复

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


cancellable_requester 是一个用于在 Flutter 中实现可取消网络请求的插件。它允许你在请求进行时取消它,这在用户离开页面或不再需要请求结果时非常有用。以下是如何使用 cancellable_requester 的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 cancellable_requester 依赖:

dependencies:
  flutter:
    sdk: flutter
  cancellable_requester: ^1.0.0  # 请检查最新版本

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

2. 导入包

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

import 'package:cancellable_requester/cancellable_requester.dart';

3. 创建 CancellableRequester 实例

你可以创建一个 CancellableRequester 实例来管理请求:

final requester = CancellableRequester();

4. 发送请求

使用 requester.request 方法发送请求。你可以传递一个 Future,它代表你的网络请求:

Future<void> fetchData() async {
  try {
    final response = await requester.request(
      // 这里替换为你的网络请求
      http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts')),
    );
    // 处理响应
    print('Response: ${response.body}');
  } catch (e) {
    if (e is CancelException) {
      print('Request was cancelled');
    } else {
      print('An error occurred: $e');
    }
  }
}

5. 取消请求

当你想要取消请求时,可以调用 requester.cancel() 方法:

void cancelRequest() {
  requester.cancel();
}

6. 完整示例

以下是一个完整的示例,展示了如何使用 cancellable_requester 来发送和取消网络请求:

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:cancellable_requester/cancellable_requester.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final requester = CancellableRequester();

  Future<void> fetchData() async {
    try {
      final response = await requester.request(
        http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts')),
      );
      print('Response: ${response.body}');
    } catch (e) {
      if (e is CancelException) {
        print('Request was cancelled');
      } else {
        print('An error occurred: $e');
      }
    }
  }

  void cancelRequest() {
    requester.cancel();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Cancellable Requester Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: fetchData,
              child: Text('Fetch Data'),
            ),
            ElevatedButton(
              onPressed: cancelRequest,
              child: Text('Cancel Request'),
            ),
          ],
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    requester.cancel();
    super.dispose();
  }
}
回到顶部