ПОПЫТКА РАЗМЕСТИТЬ ВЫЗОВ НЕПОСРЕДСТВЕННО ИЗ FLUTTER: исключение MissingPluginException(не найдена реализация для номера вызова метода

#flutter #dart #plugins #phone-call

Вопрос:

Я хочу, чтобы мое приложение автоматически звонило на определенный номер при возникновении определенных условий. Двумя популярными плагинами являются flutter_phone_direct_caller и url_launcher. Проблема запуска Url-адресов заключается в том, что метод отправит номер на номеронабиратель вашего телефона, но не начнет вызов, но 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): [ОШИБКА:flutter/lib/ui/ui_dart_state.cc(186)] Необработанное исключение: Исключение MissingPluginException(Не найдена реализация для номера вызова метода на канале flutter_phone_direct_caller)

Этот плагин пользуется популярностью на 94%, поэтому он работает для большинства людей. Кто-нибудь знает, в чем проблема?

Комментарии:

1. Я вижу, что вы уже подняли issue вопрос на их github. Какое устройство вы используете для разработки ?

2. да, redmi note 9 pro

3. Я использую Oppo Reno 5 Pro и просто скопировал ваш код и заменил свой номер телефона. На самом деле это прекрасно работает для меня.

4. Какую версию flutter_phone_direct_caller вы используете ?

5. Я добавил ответ. Проверьте, решает ли это вашу проблему.

Ответ №1:

Способ интеграции flutter с собственной функциональностью заключается в том, что он создает то, что называется MethodChannels , с помощью которого они могут вызывать функции, зарегистрированные в собственном java коде из dart.

Таким образом, одна из причин, по которой может возникнуть эта ошибка, заключается в том, что ваш код flutter не может взаимодействовать с собственным кодом java, что означает, что он не находит channel его или не находит method зарегистрированный пакет через channel там.

Я подозреваю, что это может быть проблемой сборки.

Шаги

  1. Удалите приложение с вашего устройства.
  2. Перестройте приложение снова.

Это должно решить проблему.

Комментарии:

1. Да, это сработало! спасибо тебе огромное, никогда бы не догадался об этом сам.

2. Рад, что помог 😀