#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
insideloginModel
,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');
}
}