Flutter界面翻转动画插件flipper_util的使用

Flutter界面翻转动画插件flipper_util的使用

flipper_util 是一个用于在 Flutter 应用中集成 Flipper 的插件。Flipper 是一个开源的移动应用调试工具,支持多种平台,如 Android 和 iOS。

开始使用

首先,你需要将 flipper_util 添加到你的项目依赖中。你可以在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flipper_util: ^x.y.z  # 替换为最新版本号

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

使用dio拦截器

flipper_util 提供了 FlipperKitDioInterceptor,它可以帮助你在发送 HTTP 请求时报告相关信息给 Flipper 客户端。

Dio dio = Dio();

// 添加 FlipperKitDioInterceptor 作为最后一个拦截器
dio.interceptors.add(FlipperKitDioInterceptor(topRouter: () {
  // 返回顶部路由名称,它将在请求头中显示
  return "page/topTest";
}));

这样配置后,顶部路由(top router)会在请求头中显示为 “flutter-top-router”,请求的 Cookie 将在响应头中显示为 “cookies_from_request”。

示例代码

下面是一个完整的示例代码,展示了如何在 Flutter 应用中使用 flipper_util 插件。

import 'dart:async';

import 'package:dio/dio.dart';
import 'package:flipper_util/flipper_util.dart';
import 'package:flipper_util/flipperkit_dio_interceptor.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

  // 初始化 Dio 并添加 FlipperKitDioInterceptor
  MyApp.dio.interceptors.add(FlipperKitDioInterceptor(topRouter: () {
    return "page/topTest";
  }));
}

class MyApp extends StatefulWidget {
  static Dio dio = Dio();

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _flipperUtilPlugin = FlipperUtil();

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 异步初始化平台状态
  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion = 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Column(
            children: [
              ElevatedButton(
                  onPressed: () {
                    getHtml();
                  },
                  child: Text('发送 GET 请求 -> HTML')),
              ElevatedButton(
                  onPressed: () {
                    getImage();
                  },
                  child: Text('发送 GET 请求 -> 图片')),
              ElevatedButton(
                  onPressed: () {
                    postJson();
                  },
                  child: Text('发送 POST 请求 -> JSON')),
              ElevatedButton(
                  onPressed: () {
                    uploadImage();
                  },
                  child: Text('发送 PUT 请求 -> 上传图片')),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> getHtml() async {
    Map<String, dynamic> headers = {};
    headers["p1"] = 90;
    headers["p2"] = 91;
    Response response = await MyApp.dio.get(
        "https://book.flutterchina.club/chapter11/dio.html#_11-3-1-_11-3-1引入dio",
        options: Options(headers: headers));
    // print(response.data.toString());
  }

  Future<void> getImage() async {
    Map<String, dynamic> headers = {};
    headers["p67"] = 90;
    headers["p56"] = 91;
    Response response = await MyApp.dio.get(
        "http://n.sinaimg.cn/front/121/w1441h1080/20180415/BRHA-fzcyxmv0612172.jpg",
        options: Options(headers: headers));
    // print(response.data.toString());
  }

  Future<void> postJson() async {
    Map<String, dynamic> headers = {};
    headers["p1"] = 90;
    headers["p2"] = 91;
    Response response = await MyApp.dio.post(
        "https://book.flutterchina.club/chapter11/dio.html#_11-3-1-_11-3-1引入dio",
        data: {"key": "value"},
        options: Options(headers: headers));
    // print(response.data.toString());
  }

  Future<void> uploadImage() async {
    Map<String, dynamic> headers = {};
    headers["p1"] = 90;
    headers["p2"] = 91;
    Response response = await MyApp.dio.put(
        "https://book.flutterchina.club/chapter11/dio.html#_11-3-1-_11-3-1引入dio",
        data: FormData.fromMap({"file": await MultipartFile.fromFile("path/to/image")}),
        options: Options(headers: headers));
    // print(response.data.toString());
  }
}

注意事项

如果你使用了 dio_http_formatter,你需要覆盖其方法以确保正确处理某些情况:

class MyHttpFormatter extends HttpFormatter {

  [@override](/user/override)
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    options.extra.putIfAbsent("start_time", () => DateTime.now().millisecondsSinceEpoch);
    handler.next(options);
  }

  [@override](/user/override)
  void onResponse(Response response, ResponseInterceptorHandler handler) async {
    if (response.data != null && (response.data == "" || response.data == " ")) {
      response.data = '{"fakeResponseToAvoidDioCrash":1}';
    }
    super.onResponse(response, handler);
  }
}

class MyChuckerInterceprot extends ChuckerDioInterceptor {

  [@override](/user/override)
  Future<void> onResponse(Response response, ResponseInterceptorHandler handler) async {
    try {
      await super.onResponse(response, handler);
    } catch (e) {
      debugPrint(e.toString());
      handler.next(response);
    }
  }
}

更多关于Flutter界面翻转动画插件flipper_util的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter界面翻转动画插件flipper_util的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flipper_util 是一个用于在 Flutter 中实现界面翻转动画的插件。它可以帮助你轻松地创建卡片翻转、页面切换等动画效果。以下是如何使用 flipper_util 插件的详细步骤:

1. 添加依赖

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

dependencies:
  flipper_util: ^0.0.1

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

2. 导入插件

在你的 Dart 文件中导入 flipper_util

import 'package:flipper_util/flipper_util.dart';

3. 使用 FlipperUtil 创建翻转动画

FlipperUtil 提供了一个简单的方式来创建翻转动画。你可以使用 FlipperUtil.flip 方法来触发翻转动画。

以下是一个简单的示例,展示了如何使用 FlipperUtil 创建一个卡片翻转效果:

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

class FlipCardExample extends StatefulWidget {
  @override
  _FlipCardExampleState createState() => _FlipCardExampleState();
}

class _FlipCardExampleState extends State<FlipCardExample> {
  bool isFront = true;

  void _flipCard() {
    setState(() {
      isFront = !isFront;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flip Card Example'),
      ),
      body: Center(
        child: GestureDetector(
          onTap: _flipCard,
          child: AnimatedSwitcher(
            duration: Duration(milliseconds: 500),
            transitionBuilder: (Widget child, Animation<double> animation) {
              return FlipperUtil.flip(child, animation);
            },
            child: isFront
                ? Card(
                    key: ValueKey('front'),
                    child: Container(
                      width: 200,
                      height: 200,
                      color: Colors.blue,
                      child: Center(
                        child: Text(
                          'Front',
                          style: TextStyle(color: Colors.white, fontSize: 24),
                        ),
                      ),
                    ),
                  )
                : Card(
                    key: ValueKey('back'),
                    child: Container(
                      width: 200,
                      height: 200,
                      color: Colors.red,
                      child: Center(
                        child: Text(
                          'Back',
                          style: TextStyle(color: Colors.white, fontSize: 24),
                        ),
                      ),
                    ),
                  ),
          ),
        ),
      ),
    );
  }
}

4. 运行示例

运行上述代码,你将看到一个卡片,点击卡片时它会翻转,显示另一面的内容。

5. 自定义动画

你可以根据需要自定义动画的持续时间、曲线等。FlipperUtil.flip 方法接受一个 Animation<double> 参数,你可以通过 CurvedAnimation 来应用不同的动画曲线。

transitionBuilder: (Widget child, Animation<double> animation) {
  final curvedAnimation = CurvedAnimation(
    parent: animation,
    curve: Curves.easeInOut,
  );
  return FlipperUtil.flip(child, curvedAnimation);
},
回到顶部