Flutter功能扩展插件katana_functions的使用

Flutter功能扩展插件katana_functions的使用

Masamune logo

Katana Functions

Follow on Twitter Follow on Threads Maintained with Melos

GitHub Sponsor


用于服务器集成的适配器插件,例如Firebase Cloud Functions。

在客户端实现了与API的接口,并允许安全地与服务器进行交互。

安装

导入以下包:

flutter pub add katana_functions

如果你使用Firebase Cloud Functions,还需要导入以下包:

flutter pub add katana_functions_firebase

实现

预备工作

始终将FunctionsAdapterScope小部件放在应用程序的根附近。

传递一个FunctionsAdapter,如RuntimeFunctionsAdapter作为适配器参数。

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FunctionsAdapterScope(
      adapter: const RuntimeFunctionsAdapter(),
      child: MaterialApp(
        home: const FunctionsPage(),
        title: "Flutter Demo",
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
      ),
    );
  }
}

创建函数

创建函数的前提条件如下:

  • 服务器端已经实现并部署。
  • 服务器端的所有输入/输出都是通过JsonMap (Map<String, dynamic>)完成的。
  • 如果通信不成功,则返回Exception

只要满足上述条件,可以使用任何通信格式,如CloudFunctions、RestAPI、GraphQL、gRPC等。(差异可以通过FunctionsAdapter吸收)

继承抽象类FunctionsAction<TResponse>FunctionsActionResponse来创建函数。

FunctionsActionaction中定义函数的操作名称。

根据从服务器返回的值创建响应toResponse(DynamicMap map)

class TestFunctionsAction extends FunctionsAction<TestFunctionsActionResponse> {
  const TestFunctionsAction({
    required this.responseMessage,
  });

  final String responseMessage;

  [@override](/user/override)
  String get action => "test";

  [@override](/user/override)
  DynamicMap? toMap() {
    return {
      "message": responseMessage,
    };
  }

  [@override](/user/override)
  TestFunctionsActionResponse toResponse(DynamicMap map) {
    return TestFunctionsActionResponse(
      message: map["message"] as String,
    );
  }
}

class TestFunctionsActionResponse extends FunctionsActionResponse {
  const TestFunctionsActionResponse({required this.message});

  final String message;
}

使用函数

创建一个Functions对象,并将要执行的FunctionAction传递给execute方法。

如果执行成功,将在execute的返回值中返回指定的响应。

final functions = Functions();
final response = await functions.execute(
  TestFunctionsAction(responseMessage: "Response"),
);
print(response?.message); // "Response"

FunctionsAdapter

可用的FunctionsAdapter如下:

  • RuntimeFunctionsAdapter:不进行服务器处理且不会出错的FunctionsAdapter。可用于存根。
  • FirebaseFunctionsAdapter:用于使用FirebaseFunctions的FunctionsAdapter,其中action是函数的名称。

通过继承FunctionsAdapter也可以与自己准备的RestAPI、GraphQL、gRPC连接。

GitHub Sponsors

欢迎赞助。感谢您的支持!

在GitHub Sponsors上赞助@mathrunet


## 示例代码


<p style="font-family: monospace"><b>example/lib/main.dart</b></p>

```dart
// Flutter imports:
import 'package:flutter/material.dart';

// Package imports:
import 'package:katana_functions/katana_functions.dart';

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

class TestFunctionsAction extends FunctionsAction<TestFunctionsActionResponse> {
  const TestFunctionsAction({
    required this.responseMessage,
  });

  final String responseMessage;

  [@override](/user/override)
  String get action => "test";

  [@override](/user/override)
  DynamicMap? toMap() {
    return {
      "message": responseMessage,
    };
  }

  [@override](/user/override)
  TestFunctionsActionResponse toResponse(DynamicMap map) {
    return TestFunctionsActionResponse(
      message: map["message"] as String,
    );
  }
}

class TestFunctionsActionResponse extends FunctionsActionResponse {
  const TestFunctionsActionResponse({required this.message});

  final String message;
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FunctionsAdapterScope(
      adapter: const RuntimeFunctionsAdapter(),
      child: MaterialApp(
        home: const FunctionsPage(),
        title: "Flutter Demo",
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
      ),
    );
  }
}

class FunctionsPage extends StatefulWidget {
  const FunctionsPage({super.key});

  [@override](/user/override)
  State<StatefulWidget> createState() => FunctionsPageState();
}

class FunctionsPageState extends State<FunctionsPage> {
  final functions = Functions();

  [@override](/user/override)
  void initState() {
    super.initState();
    functions.addListener(_handledOnUpdate);
  }

  void _handledOnUpdate() {
    setState(() {});
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    functions.removeListener(_handledOnUpdate);
    functions.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("App Demo")),
      body: ListView(
        children: [
          ListTile(
            title: const Text("Test Functions"),
            onTap: () async {
              final response = await functions.execute(
                const TestFunctionsAction(responseMessage: "success"),
              );
              debugPrint(response?.message); // "success"
            },
          )
        ],
      ),
    );
  }
}

更多关于Flutter功能扩展插件katana_functions的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能扩展插件katana_functions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用katana_functions插件的示例代码。这个插件假设提供了一些实用的功能扩展,不过具体功能和API可能会根据插件的实际版本有所不同。由于我无法直接访问该插件的文档(因为katana_functions并非一个广为人知的Flutter插件,可能是特定项目或团队内部使用的插件),以下示例将基于一般插件使用的假设进行编写。

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

dependencies:
  flutter:
    sdk: flutter
  katana_functions: ^x.y.z  # 请替换为实际的版本号

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

接下来,在你的Flutter项目中使用katana_functions插件。以下是一个简单的示例,展示如何调用插件中可能提供的一些功能(假设插件有这些功能):

import 'package:flutter/material.dart';
import 'package:katana_functions/katana_functions.dart'; // 导入插件

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String resultText = "";

  void _performKatanaFunction() async {
    // 假设katana_functions插件有一个名为stringManipulation的函数,用于处理字符串
    // 这里我们传入一个示例字符串,并等待结果
    String input = "Hello, Katana Functions!";
    try {
      String manipulatedString = await KatanaFunctions.stringManipulation(input);
      setState(() {
        resultText = manipulatedString;
      });
    } catch (e) {
      setState(() {
        resultText = "Error: ${e.message}";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Katana Functions Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Result:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              resultText,
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _performKatanaFunction,
              child: Text('Perform Katana Function'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。当用户点击按钮时,将调用katana_functions插件中假设存在的stringManipulation函数来处理一个字符串,并将结果显示在屏幕上。

请注意,由于katana_functions插件的具体API和功能未知,上述代码中的KatanaFunctions.stringManipulation函数是假设存在的。你需要根据插件的实际文档和API来调整代码。

此外,如果插件包含异步功能,请确保正确处理异步操作,如使用await关键字和适当的错误处理。

希望这个示例能帮助你开始在Flutter项目中使用katana_functions插件!如果有更多具体需求或插件的详细信息,请提供更多背景,以便给出更精确的代码示例。

回到顶部