Неожиданный выброс исключения PlatformException

#error-handling #dart #flutter #scoped-model

#обработка ошибок #dart #трепетать #модель с ограниченной областью #флаттер

Вопрос:

Я вызываю метод ScopedModel извне ScopedModel (при нажатии кнопки). Но PlatformException это не улов, как я ожидаю.

PlatformException это только уловка в ScopedModel методе try/catch . Это не улавливается при нажатии кнопки try/catch .

Нажатие кнопки:

 child: RaisedButton(
  onPressed: () async {
try {
      await loginModel.signInWithGoogle();
} on PlatformException catch (e) {
  debugPrint(e.toString());
}
  },
  

Метод ScopedModel:

 await _signInWithGoogle();

…

Future<void> _signInWithGoogle() async {


…
  throw PlatformException(code: ‘Test Exception’);
} on PlatformException catch (e) {
  debugPrint(e.toString());
}
  

Я PlatformException включаю ScopedModel , чтобы проверить, когда из этого метода выбрасывается исключение.

Почему есть разница? Я хочу поймать PlatformException при нажатии кнопки

Спасибо за помощь!

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

1. Вы пробовали с await loginModel.signInWithGoogle() внутренней кнопкой нажатия?

2. @Hosar Спасибо за ответ! Это моя ошибка при копировании. У меня есть () в коде. Извините! У меня есть пример обновления. Да, все еще есть такая же проблема.

3. Насколько я понимаю, вы вызываете signInWithGoogle в loginModel экземпляре. Но внутри signInWithGoogle у вас есть попытка / уловка. Если вы хотите получить исключение при нажатии кнопки, вам нужно будет удалить try / catch внутри LoginModel или повторно создать исключение после этой строки: DebugPrint(например,toString())

4. @Hosar Спасибо за ответ! Да, вы правильно понимаете. Но даже если я удалю try/catch inside loginModel , try/catch нажатие кнопки on не будет зафиксировано PlatformException .

5. Это должно сработать, смотрите очень простой пример, который я опубликовал. Вы можете скопировать и вставить, чтобы увидеть, что он попадет в блок catch внутри onPressed. Возможно, в процессе вы получаете другое исключение. Попробуйте удалить исключение в PlatformException и просто сохраните catch(e)

Ответ №1:

Это должно сработать. Смотрите очень простой пример:

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

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

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Login userLogin = Login();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Simple exception test',
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          try {
            await userLogin.signInWithGoogle();
          } on PlatformException catch (e) {
            print('Error ...:');
            print(e);
          }
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class Login {
  Future<void> signInWithGoogle() async {
    throw PlatformException(code: 'Test Exception');
  }
}