Flutter电话呼叫结果获取插件flutter_call_outcome的使用

Flutter电话呼叫结果获取插件flutter_call_outcome的使用

flutter_call_outcome 是一个用于在Flutter应用中处理函数调用结果和异常的插件。它允许你同时返回数据和异常,并且可以将数据类型强耦合到特定的数据类型。

🛠 Features

  • ✅ 同时返回数据变量和异常。
  • ✅ 使数据与特定数据类型强耦合。
  • ❌ 不支持返回多个参数(Dart不支持)。

⚡️ Getting Started

🎖 Installation

pubspec.yaml 文件的 dependencies: 部分添加以下行:

dependencies:
  flutter_call_outcome: ^0.0.2

然后通过以下方式导入包:

import 'package:flutter_call_outcome/flutter_call_outcome.dart';

🎮 Usage

以下是一个完整的示例,展示了如何使用 flutter_call_outcome 包来处理同步和异步函数调用的结果。

示例代码

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

void main() => runApp(const MyApp());

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

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

class _MyAppState extends State<MyApp> {
  bool isCallAsync = false;
  int count = -1;
  late CallOutcome<String> result;

  // 异步函数示例
  Future<CallOutcome<String>> functionAsync() async {
    await Future.delayed(const Duration(milliseconds: 1500));
    return CallOutcome(data: "Hello world from async");
  }

  // 同步函数示例
  CallOutcome<String> function() {
    setState(() {
      count++;
    });
    if (count % 2 == 0) {
      return CallOutcome<String>(data: "Hello world from sync");
    } else {
      return CallOutcome<String>(exception: Exception("Hello world"));
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: Text(
            count == -1 ? "Start" : result.data ?? result.exception.toString(),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            if (isCallAsync) {
              result = await functionAsync();
            } else {
              result = function();
            }
            setState(() {
              isCallAsync = !isCallAsync;
            });
          },
          child: const Icon(Icons.reply),
          backgroundColor: Colors.green,
        ),
      ),
    );
  }
}

更多关于Flutter电话呼叫结果获取插件flutter_call_outcome的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter电话呼叫结果获取插件flutter_call_outcome的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_call_outcome插件来检测电话呼叫结果的代码示例。这个插件可以帮助你监听电话呼叫的结束事件并获取呼叫结果。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_call_outcome: ^x.y.z  # 请将x.y.z替换为最新版本号

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

2. 请求权限

由于这个插件需要访问电话功能,你需要在AndroidManifest.xmlInfo.plist中添加必要的权限。

Android

android/app/src/main/AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

iOS

ios/Runner/Info.plist中添加:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
<key>NSCameraUsageDescription</key>
<string>We need your permission to access the camera</string>
<key>NSPhoneUsageDescription</key>
<string>We need your permission to make phone calls</string>

注意:NSPhoneUsageDescription是必需的,而NSCameraUsageDescription是为了示例完整性,实际使用中根据需要添加。

3. 使用插件

在你的Flutter代码中,你可以如下使用flutter_call_outcome插件:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    
    // 监听电话呼叫结束事件
    FlutterCallOutcome.instance.addListener(onCallOutcome);
  }

  @override
  void dispose() {
    // 移除监听器
    FlutterCallOutcome.instance.removeListener(onCallOutcome);
    super.dispose();
  }

  void onCallOutcome(CallOutcome callOutcome) {
    // 处理呼叫结果
    print('Call outcome received: ${callOutcome.type}');
    if (callOutcome.type == CallOutcomeType.completed) {
      print('Call duration: ${callOutcome.duration}');
    } else if (callOutcome.type == CallOutcomeType.missed) {
      print('Missed call number: ${callOutcome.number}');
    } else if (callOutcome.type == CallOutcomeType.cancelled) {
      print('Call cancelled');
    } else if (callOutcome.type == CallOutcomeType.unknown) {
      print('Unknown call outcome');
    }
  }

  void makePhoneCall() async {
    // 发起电话呼叫(注意:实际开发中需要用户交互才能发起呼叫)
    const url = 'tel:+1234567890';
    if (await canLaunchUrl(Uri.parse(url))) {
      await launchUrl(Uri.parse(url));
    } else {
      throw 'Could not launch $url';
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Call Outcome Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                await makePhoneCall();
              } catch (e) {
                print(e);
              }
            },
            child: Text('Make a Call'),
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 权限请求:在实际应用中,你需要在发起呼叫前请求并检查权限。
  2. 用户交互:在iOS上,调用launchUrl方法需要在用户交互(如按钮点击)之后进行。
  3. 错误处理:添加适当的错误处理,比如处理权限拒绝的情况。

这个示例展示了如何使用flutter_call_outcome插件监听电话呼叫结束事件并处理呼叫结果。根据你的具体需求,你可以进一步扩展和定制这个示例。

回到顶部