back to home/ alert pop safety

This commit is contained in:
csf 2022-03-13 23:07:52 +08:00
parent 2247147b7b
commit 5aba802c80
6 changed files with 52 additions and 56 deletions

View File

@ -39,8 +39,13 @@ void showLoading(String text) {
EasyLoading.show(status: text, maskType: EasyLoadingMaskType.black); EasyLoading.show(status: text, maskType: EasyLoadingMaskType.black);
} }
backToHome() {
// use [popUntil()] to make sure pop action can't close the current MaterialApp context
Navigator.popUntil(globalKey.currentContext!, ModalRoute.withName("/"));
}
typedef DialogBuilder = CustomAlertDialog Function( typedef DialogBuilder = CustomAlertDialog Function(
BuildContext context, StateSetter setState); StateSetter setState, VoidCallback close);
class DialogManager { class DialogManager {
static BuildContext? _dialogContext; static BuildContext? _dialogContext;
@ -70,7 +75,8 @@ class DialogManager {
barrierDismissible: barrierDismissible, barrierDismissible: barrierDismissible,
builder: (context) { builder: (context) {
DialogManager.register(context); DialogManager.register(context);
return StatefulBuilder(builder: builder); return StatefulBuilder(
builder: (_, setState) => builder(setState, DialogManager.reset));
}); });
DialogManager.drop(); DialogManager.drop();
return res; return res;
@ -121,12 +127,11 @@ void msgBox(String type, String title, String text, {bool? hasCancel}) {
EasyLoading.dismiss(); EasyLoading.dismiss();
DialogManager.reset(); DialogManager.reset();
if (globalKey.currentContext == null) return;
final buttons = [ final buttons = [
Expanded(child: Container()), Expanded(child: Container()),
wrap(Translator.call('OK'), () { wrap(Translator.call('OK'), () {
EasyLoading.dismiss(); EasyLoading.dismiss();
Navigator.pop(globalKey.currentContext!); backToHome();
}) })
]; ];
if (hasCancel == null) { if (hasCancel == null) {

View File

@ -39,9 +39,6 @@ class App extends StatelessWidget {
visualDensity: VisualDensity.adaptivePlatformDensity, visualDensity: VisualDensity.adaptivePlatformDensity,
), ),
home: HomePage(), home: HomePage(),
routes: {
"server_page": (context) => ServerPage(),
},
navigatorObservers: [ navigatorObservers: [
FirebaseAnalyticsObserver(analytics: analytics), FirebaseAnalyticsObserver(analytics: analytics),
], ],

View File

@ -104,7 +104,7 @@ class FileModel extends ChangeNotifier {
} else { } else {
_currentRemoteDir = fileDir; _currentRemoteDir = fileDir;
} }
notifyListeners(); notifyListeners(); // TODO use too early, error occur:setState() or markNeedsBuild() called during build.
} catch (e) { } catch (e) {
debugPrint("Failed to tryUpdateDir :$fd"); debugPrint("Failed to tryUpdateDir :$fd");
} }
@ -156,7 +156,8 @@ class FileModel extends ChangeNotifier {
} }
items.items.forEach((entry) { items.items.forEach((entry) {
_jobId++; _jobId++;
if (entry.isFile) { // TODO dir if (entry.isFile) {
// TODO dir
final msg = { final msg = {
"id": _jobId.toString(), "id": _jobId.toString(),
"path": entry.path, "path": entry.path,
@ -170,9 +171,7 @@ class FileModel extends ChangeNotifier {
}); });
} }
createDir(String path){ createDir(String path) {}
}
changeSortStyle(SortBy sort) { changeSortStyle(SortBy sort) {
_sortStyle = sort; _sortStyle = sort;

View File

@ -310,7 +310,7 @@ class _RemotePageState extends State<RemotePage> {
IconButton( IconButton(
color: Colors.white, color: Colors.white,
icon: Icon(Icons.message), icon: Icon(Icons.message),
onPressed:toggleChatOverlay, onPressed: toggleChatOverlay,
), ),
IconButton( IconButton(
color: Colors.white, color: Colors.white,
@ -778,8 +778,6 @@ class ImagePainter extends CustomPainter {
} }
} }
CheckboxListTile getToggle( CheckboxListTile getToggle(
void Function(void Function()) setState, option, name) { void Function(void Function()) setState, option, name) {
return CheckboxListTile( return CheckboxListTile(
@ -848,7 +846,7 @@ void showOptions() {
} }
final perms = FFI.ffiModel.permissions; final perms = FFI.ffiModel.permissions;
DialogManager.show((context, setState) { DialogManager.show((setState, close) {
final more = <Widget>[]; final more = <Widget>[];
if (perms['audio'] != false) { if (perms['audio'] != false) {
more.add(getToggle(setState, 'disable-audio', 'Mute')); more.add(getToggle(setState, 'disable-audio', 'Mute'));
@ -879,34 +877,31 @@ void showOptions() {
}); });
}; };
return CustomAlertDialog( return CustomAlertDialog(
title: SizedBox.shrink(), title: SizedBox.shrink(),
content: Column( content: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: displays + children: displays +
(isDesktop (isDesktop
? <Widget>[ ? <Widget>[
getRadio( getRadio('Original', 'original', viewStyle, setViewStyle),
'Original', 'original', viewStyle, setViewStyle), getRadio('Shrink', 'shrink', viewStyle, setViewStyle),
getRadio('Shrink', 'shrink', viewStyle, setViewStyle), getRadio('Stretch', 'stretch', viewStyle, setViewStyle),
getRadio('Stretch', 'stretch', viewStyle, setViewStyle), Divider(color: MyTheme.border),
Divider(color: MyTheme.border), ]
] : []) +
: []) + <Widget>[
<Widget>[ getRadio('Good image quality', 'best', quality, setQuality),
getRadio('Good image quality', 'best', quality, setQuality), getRadio('Balanced', 'balanced', quality, setQuality),
getRadio('Balanced', 'balanced', quality, setQuality), getRadio('Optimize reaction time', 'low', quality, setQuality),
getRadio( Divider(color: MyTheme.border),
'Optimize reaction time', 'low', quality, setQuality), getToggle(setState, 'show-remote-cursor', 'Show remote cursor'),
Divider(color: MyTheme.border), ] +
getToggle( more),
setState, 'show-remote-cursor', 'Show remote cursor'), actions: [],
] + onWillPop: () async => true,
more), contentPadding: 0,
actions: [],
onWillPop: () async => true,
contentPadding: 0,
); );
},barrierDismissible: true); }, barrierDismissible: true);
} }
void showSetOSPassword(bool login) { void showSetOSPassword(bool login) {
@ -914,7 +909,7 @@ void showSetOSPassword(bool login) {
var password = FFI.getByName('peer_option', "os-password"); var password = FFI.getByName('peer_option', "os-password");
var autoLogin = FFI.getByName('peer_option', "auto-login") != ""; var autoLogin = FFI.getByName('peer_option', "auto-login") != "";
controller.text = password; controller.text = password;
DialogManager.show((context, setState) { DialogManager.show((setState, close) {
return CustomAlertDialog( return CustomAlertDialog(
title: Text(translate('OS Password')), title: Text(translate('OS Password')),
content: Column(mainAxisSize: MainAxisSize.min, children: [ content: Column(mainAxisSize: MainAxisSize.min, children: [
@ -937,7 +932,7 @@ void showSetOSPassword(bool login) {
TextButton( TextButton(
style: flatButtonStyle, style: flatButtonStyle,
onPressed: () { onPressed: () {
Navigator.pop(context); close();
}, },
child: Text(translate('Cancel')), child: Text(translate('Cancel')),
), ),
@ -952,7 +947,7 @@ void showSetOSPassword(bool login) {
if (text != "" && login) { if (text != "" && login) {
FFI.setByName('input_os_password', text); FFI.setByName('input_os_password', text);
} }
Navigator.pop(context); close();
}, },
child: Text(translate('OK')), child: Text(translate('OK')),
), ),

View File

@ -69,7 +69,7 @@ void showServer() {
var id = ''; var id = '';
var relay = ''; var relay = '';
var key = ''; var key = '';
DialogManager.show((context, setState) { DialogManager.show((setState, close) {
return CustomAlertDialog( return CustomAlertDialog(
title: Text(translate('ID Server')), title: Text(translate('ID Server')),
content: Form( content: Form(
@ -112,7 +112,7 @@ void showServer() {
TextButton( TextButton(
style: flatButtonStyle, style: flatButtonStyle,
onPressed: () { onPressed: () {
DialogManager.reset(); close();
}, },
child: Text(translate('Cancel')), child: Text(translate('Cancel')),
), ),
@ -130,7 +130,7 @@ void showServer() {
'option', '{"name": "relay-server", "value": "$relay"}'); 'option', '{"name": "relay-server", "value": "$relay"}');
if (key != key0) if (key != key0)
FFI.setByName('option', '{"name": "key", "value": "$key"}'); FFI.setByName('option', '{"name": "key", "value": "$key"}');
DialogManager.reset(); close();
} }
}, },
child: Text(translate('OK')), child: Text(translate('OK')),

View File

@ -9,7 +9,7 @@ void clientClose() {
void enterPasswordDialog(String id) { void enterPasswordDialog(String id) {
final controller = TextEditingController(); final controller = TextEditingController();
var remember = FFI.getByName('remember', id) == 'true'; var remember = FFI.getByName('remember', id) == 'true';
DialogManager.show((context, setState) { DialogManager.show((setState, close) {
return CustomAlertDialog( return CustomAlertDialog(
title: Text(translate('Password Required')), title: Text(translate('Password Required')),
content: Column(mainAxisSize: MainAxisSize.min, children: [ content: Column(mainAxisSize: MainAxisSize.min, children: [
@ -34,8 +34,8 @@ void enterPasswordDialog(String id) {
TextButton( TextButton(
style: flatButtonStyle, style: flatButtonStyle,
onPressed: () { onPressed: () {
DialogManager.reset(); close();
Navigator.pop(globalKey.currentContext!); backToHome();
}, },
child: Text(translate('Cancel')), child: Text(translate('Cancel')),
), ),
@ -45,7 +45,7 @@ void enterPasswordDialog(String id) {
var text = controller.text.trim(); var text = controller.text.trim();
if (text == '') return; if (text == '') return;
FFI.login(text, remember); FFI.login(text, remember);
DialogManager.reset(); close();
showLoading(translate('Logging in...')); showLoading(translate('Logging in...'));
}, },
child: Text(translate('OK')), child: Text(translate('OK')),
@ -56,15 +56,15 @@ void enterPasswordDialog(String id) {
} }
void wrongPasswordDialog(String id) { void wrongPasswordDialog(String id) {
DialogManager.show((context, setState) => CustomAlertDialog( DialogManager.show((setState, close) => CustomAlertDialog(
title: Text(translate('Wrong Password')), title: Text(translate('Wrong Password')),
content: Text(translate('Do you want to enter again?')), content: Text(translate('Do you want to enter again?')),
actions: [ actions: [
TextButton( TextButton(
style: flatButtonStyle, style: flatButtonStyle,
onPressed: () { onPressed: () {
DialogManager.reset(); close();
Navigator.pop(globalKey.currentContext!); backToHome();
}, },
child: Text(translate('Cancel')), child: Text(translate('Cancel')),
), ),