Settings Screens: Null safety++

This commit is contained in:
Vishesh Handa
2021-05-27 13:19:20 +02:00
parent 8c326399bd
commit 789a0b1208
5 changed files with 54 additions and 54 deletions

View File

@ -100,7 +100,7 @@ class GitNoteRepository {
} }
Future<NoteRepoResult> addFolderConfig(NotesFolderConfig config) async { Future<NoteRepoResult> addFolderConfig(NotesFolderConfig config) async {
var pathSpec = config.folder.pathSpec(); var pathSpec = config.folder!.pathSpec();
pathSpec = pathSpec.isNotEmpty ? pathSpec : '/'; pathSpec = pathSpec.isNotEmpty ? pathSpec : '/';
await _add("."); await _add(".");
@ -110,7 +110,8 @@ class GitNoteRepository {
authorName: settings.gitAuthor, authorName: settings.gitAuthor,
); );
return NoteRepoResult(noteFilePath: config.folder.folderPath, error: false); return NoteRepoResult(
noteFilePath: config.folder!.folderPath, error: false);
} }
Future<NoteRepoResult> renameFolder( Future<NoteRepoResult> renameFolder(

View File

@ -26,7 +26,7 @@ class NotesFolderConfig extends Equatable {
final bool showNoteSummary; final bool showNoteSummary;
final NoteFileNameFormat fileNameFormat; final NoteFileNameFormat fileNameFormat;
final NoteFileNameFormat journalFileNameFormat; final NoteFileNameFormat journalFileNameFormat;
final NotesFolderFS folder; final NotesFolderFS? folder;
final bool yamlHeaderEnabled; final bool yamlHeaderEnabled;
//int _version = 1; //int _version = 1;
@ -64,7 +64,7 @@ class NotesFolderConfig extends Equatable {
viewHeader, viewHeader,
fileNameFormat, fileNameFormat,
journalFileNameFormat, journalFileNameFormat,
folder, if (folder != null) folder!,
yamlHeaderEnabled, yamlHeaderEnabled,
yamlModifiedKey, yamlModifiedKey,
yamlCreatedKey, yamlCreatedKey,
@ -98,7 +98,7 @@ class NotesFolderConfig extends Equatable {
viewHeader: viewHeader, viewHeader: viewHeader,
fileNameFormat: settings.noteFileNameFormat, fileNameFormat: settings.noteFileNameFormat,
journalFileNameFormat: settings.journalNoteFileNameFormat, journalFileNameFormat: settings.journalNoteFileNameFormat,
folder: folder!, folder: folder,
yamlHeaderEnabled: settings.yamlHeaderEnabled, yamlHeaderEnabled: settings.yamlHeaderEnabled,
yamlCreatedKey: settings.yamlCreatedKey, yamlCreatedKey: settings.yamlCreatedKey,
yamlModifiedKey: settings.yamlModifiedKey, yamlModifiedKey: settings.yamlModifiedKey,
@ -289,7 +289,7 @@ class NotesFolderConfig extends Equatable {
var yaml = toYAML(map); var yaml = toYAML(map);
var file = File(p.join(folder.folderPath, FILENAME)); var file = File(p.join(folder!.folderPath, FILENAME));
await file.writeAsString(yaml); await file.writeAsString(yaml);
} }
} }

View File

@ -1,5 +1,3 @@
// @dart=2.9
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -30,8 +28,8 @@ class GitRemoteSettingsScreen extends StatefulWidget {
} }
class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> { class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
String remoteHost;
var branches = <String>[]; var branches = <String>[];
var remoteHost = "";
var currentBranch = ""; var currentBranch = "";
@override @override
@ -40,8 +38,7 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
var settings = Provider.of<Settings>(context); var settings = Provider.of<Settings>(context);
var repo = Provider.of<GitJournalRepo>(context); var repo = Provider.of<GitJournalRepo>(context);
if (remoteHost == null) { if (remoteHost.isEmpty) {
remoteHost = "";
repo.remoteConfigs().then((list) { repo.remoteConfigs().then((list) {
setState(() { setState(() {
if (!mounted) return; if (!mounted) return;
@ -51,7 +48,7 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
} }
if (branches.isEmpty) { if (branches.isEmpty) {
currentBranch = repo.currentBranch; currentBranch = repo.currentBranch ?? "";
repo.branches().then((list) { repo.branches().then((list) {
setState(() { setState(() {
if (!mounted) return; if (!mounted) return;
@ -62,14 +59,13 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
var body = Column( var body = Column(
children: <Widget>[ children: <Widget>[
if (remoteHost != null && remoteHost.isNotEmpty) if (remoteHost.isNotEmpty)
Text( Text(
tr('settings.gitRemote.host'), tr('settings.gitRemote.host'),
style: textTheme.bodyText1, style: textTheme.bodyText1,
textAlign: TextAlign.left, textAlign: TextAlign.left,
), ),
if (remoteHost != null && remoteHost.isNotEmpty) if (remoteHost.isNotEmpty) ListTile(title: Text(remoteHost)),
ListTile(title: Text(remoteHost)),
if (branches.isNotEmpty) if (branches.isNotEmpty)
ListPreference( ListPreference(
title: tr('settings.gitRemote.branch'), title: tr('settings.gitRemote.branch'),
@ -191,9 +187,9 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
"-" + "-" +
DateTime.now().toIso8601String().substring(0, 10); // only the date DateTime.now().toIso8601String().substring(0, 10); // only the date
generateSSHKeys(comment: comment).then((SshKey sshKey) { generateSSHKeys(comment: comment).then((SshKey? sshKey) {
var settings = Provider.of<Settings>(context, listen: false); var settings = Provider.of<Settings>(context, listen: false);
settings.sshPublicKey = sshKey.publicKey; settings.sshPublicKey = sshKey!.publicKey;
settings.sshPrivateKey = sshKey.publicKey; settings.sshPrivateKey = sshKey.publicKey;
settings.sshPassword = sshKey.password; settings.sshPassword = sshKey.password;
settings.save(); settings.save();
@ -250,9 +246,9 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
class Button extends StatelessWidget { class Button extends StatelessWidget {
final String text; final String text;
final Function onPressed; final void Function() onPressed;
Button({@required this.text, @required this.onPressed}); Button({required this.text, required this.onPressed});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -273,9 +269,9 @@ class Button extends StatelessWidget {
class RedButton extends StatelessWidget { class RedButton extends StatelessWidget {
final String text; final String text;
final Function onPressed; final void Function() onPressed;
RedButton({@required this.text, @required this.onPressed}); RedButton({required this.text, required this.onPressed});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -1,5 +1,3 @@
// @dart=2.9
/* /*
Copyright 2020-2021 Vishesh Handa <me@vhanda.in> Copyright 2020-2021 Vishesh Handa <me@vhanda.in>
@ -44,8 +42,8 @@ class NoteMetadataSettingsScreen extends StatefulWidget {
class _NoteMetadataSettingsScreenState class _NoteMetadataSettingsScreenState
extends State<NoteMetadataSettingsScreen> { extends State<NoteMetadataSettingsScreen> {
DateTime created; late DateTime created;
DateTime modified; late DateTime modified;
@override @override
void initState() { void initState() {
@ -206,7 +204,7 @@ class NoteOutputExample extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var theme = Theme.of(context); var theme = Theme.of(context);
var style = theme.textTheme.subtitle1; var style = theme.textTheme.subtitle1!;
style = style.copyWith(fontFamily: "Roboto Mono"); style = style.copyWith(fontFamily: "Roboto Mono");
var settings = Provider.of<Settings>(context); var settings = Provider.of<Settings>(context);
@ -343,14 +341,14 @@ class CustomMetDataTile extends StatefulWidget {
final String value; final String value;
final Func1<String, void> onChange; final Func1<String, void> onChange;
CustomMetDataTile({@required this.value, @required this.onChange}); CustomMetDataTile({required this.value, required this.onChange});
@override @override
_CustomMetDataTileState createState() => _CustomMetDataTileState(); _CustomMetDataTileState createState() => _CustomMetDataTileState();
} }
class _CustomMetDataTileState extends State<CustomMetDataTile> { class _CustomMetDataTileState extends State<CustomMetDataTile> {
TextEditingController _textController; TextEditingController? _textController;
@override @override
void initState() { void initState() {
@ -386,13 +384,13 @@ class _CustomMetDataTileState extends State<CustomMetDataTile> {
var form = Form( var form = Form(
child: TextFormField( child: TextFormField(
validator: (value) { validator: (value) {
value = value.trim(); value = value!.trim();
if (value.isEmpty) { if (value.isEmpty) {
return ""; return "";
} }
var map = MarkdownYAMLCodec.parseYamlText(value); var map = MarkdownYAMLCodec.parseYamlText(value);
if (map == null || map.isEmpty) { if (map.isEmpty) {
return tr("settings.noteMetaData.customMetaData.invalid"); return tr("settings.noteMetaData.customMetaData.invalid");
} }
return ""; return "";
@ -416,9 +414,9 @@ class _CustomMetDataTileState extends State<CustomMetDataTile> {
), ),
TextButton( TextButton(
onPressed: () { onPressed: () {
var text = _textController.text.trim(); var text = _textController!.text.trim();
var map = MarkdownYAMLCodec.parseYamlText(text); var map = MarkdownYAMLCodec.parseYamlText(text);
if (map == null || map.isEmpty) { if (map.isEmpty) {
return Navigator.of(context).pop(); return Navigator.of(context).pop();
} }

View File

@ -1,5 +1,3 @@
// @dart=2.9
/* /*
Copyright 2020-2021 Vishesh Handa <me@vhanda.in> Copyright 2020-2021 Vishesh Handa <me@vhanda.in>
Roland Fredenhagen <important@van-fredenhagen.de> Roland Fredenhagen <important@van-fredenhagen.de>
@ -93,7 +91,8 @@ class SettingsListState extends State<SettingsList> {
final repo = Provider.of<GitJournalRepo>(context); final repo = Provider.of<GitJournalRepo>(context);
var repoManager = Provider.of<RepositoryManager>(context); var repoManager = Provider.of<RepositoryManager>(context);
var saveGitAuthor = (String gitAuthor) { var saveGitAuthor = (String? gitAuthor) {
if (gitAuthor == null) return;
settings.gitAuthor = gitAuthor; settings.gitAuthor = gitAuthor;
settings.save(); settings.save();
}; };
@ -107,8 +106,8 @@ class SettingsListState extends State<SettingsList> {
hintText: tr('settings.author.hint'), hintText: tr('settings.author.hint'),
labelText: tr('settings.author.label'), labelText: tr('settings.author.label'),
), ),
validator: (String value) { validator: (String? value) {
value = value.trim(); value = value!.trim();
if (value.isEmpty) { if (value.isEmpty) {
return tr('settings.author.validator'); return tr('settings.author.validator');
} }
@ -120,13 +119,15 @@ class SettingsListState extends State<SettingsList> {
initialValue: settings.gitAuthor, initialValue: settings.gitAuthor,
), ),
onChanged: () { onChanged: () {
if (!gitAuthorKey.currentState.validate()) return; if (!gitAuthorKey.currentState!.validate()) return;
var gitAuthor = gitAuthorKey.currentState.value; var gitAuthor = gitAuthorKey.currentState!.value;
saveGitAuthor(gitAuthor); saveGitAuthor(gitAuthor);
}, },
); );
var saveGitAuthorEmail = (String gitAuthorEmail) { var saveGitAuthorEmail = (String? gitAuthorEmail) {
if (gitAuthorEmail == null) return;
settings.gitAuthorEmail = gitAuthorEmail; settings.gitAuthorEmail = gitAuthorEmail;
settings.save(); settings.save();
}; };
@ -140,8 +141,8 @@ class SettingsListState extends State<SettingsList> {
hintText: tr('settings.email.hint'), hintText: tr('settings.email.hint'),
labelText: tr('settings.email.label'), labelText: tr('settings.email.label'),
), ),
validator: (String value) { validator: (String? value) {
value = value.trim(); value = value!.trim();
if (value.isEmpty) { if (value.isEmpty) {
return tr('settings.email.validator.empty'); return tr('settings.email.validator.empty');
} }
@ -157,8 +158,8 @@ class SettingsListState extends State<SettingsList> {
initialValue: settings.gitAuthorEmail, initialValue: settings.gitAuthorEmail,
), ),
onChanged: () { onChanged: () {
if (!gitAuthorEmailKey.currentState.validate()) return; if (!gitAuthorEmailKey.currentState!.validate()) return;
var gitAuthorEmail = gitAuthorEmailKey.currentState.value; var gitAuthorEmail = gitAuthorEmailKey.currentState!.value;
saveGitAuthorEmail(gitAuthorEmail); saveGitAuthorEmail(gitAuthorEmail);
}, },
); );
@ -390,7 +391,7 @@ class SettingsListState extends State<SettingsList> {
settings.storageLocation = ""; settings.storageLocation = "";
} else { } else {
settings.storageLocation = settings.storageLocation =
await ICloudDocumentsPath.documentsPath; (await ICloudDocumentsPath.documentsPath)!;
if (settings.storageLocation.isNotEmpty) { if (settings.storageLocation.isNotEmpty) {
settings.storeInternally = false; settings.storeInternally = false;
} }
@ -592,19 +593,23 @@ Future<String> _getExternalDir() async {
} }
var path = await ExtStorage.getExternalStorageDirectory(); var path = await ExtStorage.getExternalStorageDirectory();
if (await _isDirWritable(path)) { if (path != null) {
return path; if (await _isDirWritable(path)) {
} else { return path;
Log.e("ExtStorage: Got $path but it is not writable"); } else {
Log.e("ExtStorage: Got $path but it is not writable");
}
} }
var extDir = await getExternalStorageDirectory(); var extDir = await getExternalStorageDirectory();
path = extDir.path; if (extDir != null) {
path = extDir.path;
if (await _isDirWritable(path)) { if (await _isDirWritable(path)) {
return path; return path;
} else { } else {
Log.e("ExternalStorageDirectory: Got $path but it is not writable"); Log.e("ExternalStorageDirectory: Got $path but it is not writable");
}
} }
return ""; return "";