尝试直接从 FLUTTER 发出呼叫:MissingPluginException(未找到方法 callNumber 的实现

Posted

技术标签:

【中文标题】尝试直接从 FLUTTER 发出呼叫:MissingPluginException(未找到方法 callNumber 的实现【英文标题】:TRYING TO PLACE CALL DIRECTLY FROM FLUTTER: MissingPluginException(No implementation found for method callNumber 【发布时间】:2021-08-06 22:11:00 【问题描述】:

我希望我的应用在出现特定情况时自动拨打特定号码。两个流行的插件是flutter_phone_direct_caller 和url_launcher。网址启动器的问题是该方法会将号码推送到您手机的拨号器,但不会启动呼叫,但 flutter_phone_direct_caller 声称它会启动。这是他们文档中的示例。

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

void main() 
  runApp(Scaffold(
    body: Center(
      child: RaisedButton(
        onPressed: _callNumber,
        child: Text('Call Number'),
      ),
    ),
  ));


_callNumber() async
  const number = '08592119XXXX'; //set the number here
  bool res = await FlutterPhoneDirectCaller.callNumber(number);

这是我页面的代码..当按下按钮时,呼叫应该启动,但对我来说,它返回一个错误。(我的电话号码是 XXXd,当我运行它时,我输入了我的实际号码) .

import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:vitality/components/bottomAppBar.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:vitality/components/biom.dart';
import 'package:flutter_phone_direct_caller/flutter_phone_direct_caller.dart';

class HomeScreen extends StatefulWidget 
  static const String id = 'home_screen';
  final String docid;
  final bool isCaretaker;
  HomeScreen(@required this.docid, @required this.isCaretaker);
  @override
  _HomeScreenState createState() => _HomeScreenState();


_callNumber() async 
  const number = '86065XXXXX'; //set the number here
  bool res = await FlutterPhoneDirectCaller.callNumber(number);


class _HomeScreenState extends State<HomeScreen> 
  final auth = FirebaseAuth.instance;
  var pulse;
  var temp;
  @override
  Widget build(BuildContext context) 
    print('got here');
    print(auth.currentUser.uid);
    String id = ModalRoute.of(context).settings.arguments;

    CollectionReference main = FirebaseFirestore.instance.collection('maindb');
    main.doc(id).get().then((DocumentSnapshot documentSnapshot) 
      if (documentSnapshot.exists) 
        print('Document exists on the database');
        pulse = documentSnapshot['pulse'];
        temp = documentSnapshot['temperature'];
      
    );
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
          backgroundColor: Color(0xFF602247),
          toolbarHeight: 50.0,
          centerTitle: true,
          title: Text(
            'HEALTH TRACKER',
            style: Theme.of(context).textTheme.headline4,
          )),
      body: Container(
        decoration: BoxDecoration(
            image: DecorationImage(
          image:
              NetworkImage('https://cdn.wallpapersafari.com/12/24/GiZRfh.jpg'),
          fit: BoxFit.cover,
          colorFilter: new ColorFilter.mode(
              Colors.black.withOpacity(.7), BlendMode.dstATop),
        )),
        child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              Text(widget.docid),
              Text(widget.isCaretaker.toString()),
              biom(which: 'pulse', image: 'pulse', docid: widget.docid),
              RoundBorderText(text: 'PULSE'),
              biom(which: 'temperature', image: 'temper', docid: widget.docid),
              RoundBorderText(text: 'TEMPERATURE'),
              SizedBox(height: 30.0),
              FlatButton(
                  child: Text('test call'),
                  onPressed: () async 
                    FlutterPhoneDirectCaller.callNumber('5');
                  )
            ]),
      ),
      bottomNavigationBar: bottomAppBar(id: widget.docid),
    );
  


class RoundBorderText extends StatelessWidget 
  final String text;
  RoundBorderText(this.text);
  @override
  Widget build(BuildContext context) 
    return Container(
        padding: const EdgeInsets.only(
            left: 40.0, right: 40.0, top: 8.0, bottom: 8.0),
        decoration: BoxDecoration(
            // border: Border.all(
            //   color: Colors.black,
            //   width: 1.0,
            // ),
            borderRadius: BorderRadius.all(Radius.circular(20))),
        child: Text(text, style: Theme.of(context).textTheme.headline1));
  

E/flutter (23210):[ERROR:flutter/lib/ui/ui_dart_state.cc(186)] 未处理的异常:MissingPluginException(在通道 flutter_phone_direct_caller 上找不到方法 callNumber 的实现)

这个插件有 94% 的流行度,所以它适用于大多数人。有谁知道是什么问题?

【问题讨论】:

我看到你已经在他们的 github 上提出了issue。您使用哪种设备进行开发? 是的,红米note 9 pro 我使用的是 Oppo Reno 5 Pro,只是复制了您的代码并替换了我的电话号码。它实际上对我来说工作得很好。 您使用的是哪个版本的flutter_phone_direct_caller 我已经添加了一个答案。检查它是否解决了您的问题。 【参考方案1】:

flutter 与原生功能集成的方式是创建所谓的MethodChannels,使用它可以调用注册在原生java dart 代码中的函数。

所以这个错误可能出现的一个原因是您的颤振代码无法与本机 java 代码通信,这意味着它没有找到任何 channel 或者它没有找到包通过以下方式注册的 method channel 那里。

我怀疑这可能是构建问题。

步骤

    从您的设备上卸载应用程序。 再次重建应用程序。

这应该可以解决问题。

【讨论】:

是的,这行得通!非常感谢你,我自己永远也想不通。 很高兴有帮助:D 有效答案+1

以上是关于尝试直接从 FLUTTER 发出呼叫:MissingPluginException(未找到方法 callNumber 的实现的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 来自 WebViewScaffold 中显示的网页的电话呼叫

如何从flutter应用程序向本地主机发出http get请求?

如何在颤振小部件测试中发出 http 请求?

Flutter 物理 iOS 设备无法向我的本地 asp.net 服务器发出 api 请求

Flutter - 无法发出 POST 请求

试图从世界时间 api 颤振发出 json 请求