mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-26 08:36:50 +08:00
Settings Screens: Null safety++
This commit is contained in:
@ -100,7 +100,7 @@ class GitNoteRepository {
|
||||
}
|
||||
|
||||
Future<NoteRepoResult> addFolderConfig(NotesFolderConfig config) async {
|
||||
var pathSpec = config.folder.pathSpec();
|
||||
var pathSpec = config.folder!.pathSpec();
|
||||
pathSpec = pathSpec.isNotEmpty ? pathSpec : '/';
|
||||
|
||||
await _add(".");
|
||||
@ -110,7 +110,8 @@ class GitNoteRepository {
|
||||
authorName: settings.gitAuthor,
|
||||
);
|
||||
|
||||
return NoteRepoResult(noteFilePath: config.folder.folderPath, error: false);
|
||||
return NoteRepoResult(
|
||||
noteFilePath: config.folder!.folderPath, error: false);
|
||||
}
|
||||
|
||||
Future<NoteRepoResult> renameFolder(
|
||||
|
@ -26,7 +26,7 @@ class NotesFolderConfig extends Equatable {
|
||||
final bool showNoteSummary;
|
||||
final NoteFileNameFormat fileNameFormat;
|
||||
final NoteFileNameFormat journalFileNameFormat;
|
||||
final NotesFolderFS folder;
|
||||
final NotesFolderFS? folder;
|
||||
final bool yamlHeaderEnabled;
|
||||
//int _version = 1;
|
||||
|
||||
@ -64,7 +64,7 @@ class NotesFolderConfig extends Equatable {
|
||||
viewHeader,
|
||||
fileNameFormat,
|
||||
journalFileNameFormat,
|
||||
folder,
|
||||
if (folder != null) folder!,
|
||||
yamlHeaderEnabled,
|
||||
yamlModifiedKey,
|
||||
yamlCreatedKey,
|
||||
@ -98,7 +98,7 @@ class NotesFolderConfig extends Equatable {
|
||||
viewHeader: viewHeader,
|
||||
fileNameFormat: settings.noteFileNameFormat,
|
||||
journalFileNameFormat: settings.journalNoteFileNameFormat,
|
||||
folder: folder!,
|
||||
folder: folder,
|
||||
yamlHeaderEnabled: settings.yamlHeaderEnabled,
|
||||
yamlCreatedKey: settings.yamlCreatedKey,
|
||||
yamlModifiedKey: settings.yamlModifiedKey,
|
||||
@ -289,7 +289,7 @@ class NotesFolderConfig extends Equatable {
|
||||
|
||||
var yaml = toYAML(map);
|
||||
|
||||
var file = File(p.join(folder.folderPath, FILENAME));
|
||||
var file = File(p.join(folder!.folderPath, FILENAME));
|
||||
await file.writeAsString(yaml);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,3 @@
|
||||
// @dart=2.9
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
@ -30,8 +28,8 @@ class GitRemoteSettingsScreen extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
|
||||
String remoteHost;
|
||||
var branches = <String>[];
|
||||
var remoteHost = "";
|
||||
var currentBranch = "";
|
||||
|
||||
@override
|
||||
@ -40,8 +38,7 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
|
||||
var settings = Provider.of<Settings>(context);
|
||||
var repo = Provider.of<GitJournalRepo>(context);
|
||||
|
||||
if (remoteHost == null) {
|
||||
remoteHost = "";
|
||||
if (remoteHost.isEmpty) {
|
||||
repo.remoteConfigs().then((list) {
|
||||
setState(() {
|
||||
if (!mounted) return;
|
||||
@ -51,7 +48,7 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
|
||||
}
|
||||
|
||||
if (branches.isEmpty) {
|
||||
currentBranch = repo.currentBranch;
|
||||
currentBranch = repo.currentBranch ?? "";
|
||||
repo.branches().then((list) {
|
||||
setState(() {
|
||||
if (!mounted) return;
|
||||
@ -62,14 +59,13 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
|
||||
|
||||
var body = Column(
|
||||
children: <Widget>[
|
||||
if (remoteHost != null && remoteHost.isNotEmpty)
|
||||
if (remoteHost.isNotEmpty)
|
||||
Text(
|
||||
tr('settings.gitRemote.host'),
|
||||
style: textTheme.bodyText1,
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
if (remoteHost != null && remoteHost.isNotEmpty)
|
||||
ListTile(title: Text(remoteHost)),
|
||||
if (remoteHost.isNotEmpty) ListTile(title: Text(remoteHost)),
|
||||
if (branches.isNotEmpty)
|
||||
ListPreference(
|
||||
title: tr('settings.gitRemote.branch'),
|
||||
@ -191,9 +187,9 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
|
||||
"-" +
|
||||
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);
|
||||
settings.sshPublicKey = sshKey.publicKey;
|
||||
settings.sshPublicKey = sshKey!.publicKey;
|
||||
settings.sshPrivateKey = sshKey.publicKey;
|
||||
settings.sshPassword = sshKey.password;
|
||||
settings.save();
|
||||
@ -250,9 +246,9 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
|
||||
|
||||
class Button extends StatelessWidget {
|
||||
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
|
||||
Widget build(BuildContext context) {
|
||||
@ -273,9 +269,9 @@ class Button extends StatelessWidget {
|
||||
|
||||
class RedButton extends StatelessWidget {
|
||||
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
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -1,5 +1,3 @@
|
||||
// @dart=2.9
|
||||
|
||||
/*
|
||||
Copyright 2020-2021 Vishesh Handa <me@vhanda.in>
|
||||
|
||||
@ -44,8 +42,8 @@ class NoteMetadataSettingsScreen extends StatefulWidget {
|
||||
|
||||
class _NoteMetadataSettingsScreenState
|
||||
extends State<NoteMetadataSettingsScreen> {
|
||||
DateTime created;
|
||||
DateTime modified;
|
||||
late DateTime created;
|
||||
late DateTime modified;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@ -206,7 +204,7 @@ class NoteOutputExample extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var theme = Theme.of(context);
|
||||
var style = theme.textTheme.subtitle1;
|
||||
var style = theme.textTheme.subtitle1!;
|
||||
style = style.copyWith(fontFamily: "Roboto Mono");
|
||||
|
||||
var settings = Provider.of<Settings>(context);
|
||||
@ -343,14 +341,14 @@ class CustomMetDataTile extends StatefulWidget {
|
||||
final String value;
|
||||
final Func1<String, void> onChange;
|
||||
|
||||
CustomMetDataTile({@required this.value, @required this.onChange});
|
||||
CustomMetDataTile({required this.value, required this.onChange});
|
||||
|
||||
@override
|
||||
_CustomMetDataTileState createState() => _CustomMetDataTileState();
|
||||
}
|
||||
|
||||
class _CustomMetDataTileState extends State<CustomMetDataTile> {
|
||||
TextEditingController _textController;
|
||||
TextEditingController? _textController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@ -386,13 +384,13 @@ class _CustomMetDataTileState extends State<CustomMetDataTile> {
|
||||
var form = Form(
|
||||
child: TextFormField(
|
||||
validator: (value) {
|
||||
value = value.trim();
|
||||
value = value!.trim();
|
||||
if (value.isEmpty) {
|
||||
return "";
|
||||
}
|
||||
|
||||
var map = MarkdownYAMLCodec.parseYamlText(value);
|
||||
if (map == null || map.isEmpty) {
|
||||
if (map.isEmpty) {
|
||||
return tr("settings.noteMetaData.customMetaData.invalid");
|
||||
}
|
||||
return "";
|
||||
@ -416,9 +414,9 @@ class _CustomMetDataTileState extends State<CustomMetDataTile> {
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
var text = _textController.text.trim();
|
||||
var text = _textController!.text.trim();
|
||||
var map = MarkdownYAMLCodec.parseYamlText(text);
|
||||
if (map == null || map.isEmpty) {
|
||||
if (map.isEmpty) {
|
||||
return Navigator.of(context).pop();
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,3 @@
|
||||
// @dart=2.9
|
||||
|
||||
/*
|
||||
Copyright 2020-2021 Vishesh Handa <me@vhanda.in>
|
||||
Roland Fredenhagen <important@van-fredenhagen.de>
|
||||
@ -93,7 +91,8 @@ class SettingsListState extends State<SettingsList> {
|
||||
final repo = Provider.of<GitJournalRepo>(context);
|
||||
var repoManager = Provider.of<RepositoryManager>(context);
|
||||
|
||||
var saveGitAuthor = (String gitAuthor) {
|
||||
var saveGitAuthor = (String? gitAuthor) {
|
||||
if (gitAuthor == null) return;
|
||||
settings.gitAuthor = gitAuthor;
|
||||
settings.save();
|
||||
};
|
||||
@ -107,8 +106,8 @@ class SettingsListState extends State<SettingsList> {
|
||||
hintText: tr('settings.author.hint'),
|
||||
labelText: tr('settings.author.label'),
|
||||
),
|
||||
validator: (String value) {
|
||||
value = value.trim();
|
||||
validator: (String? value) {
|
||||
value = value!.trim();
|
||||
if (value.isEmpty) {
|
||||
return tr('settings.author.validator');
|
||||
}
|
||||
@ -120,13 +119,15 @@ class SettingsListState extends State<SettingsList> {
|
||||
initialValue: settings.gitAuthor,
|
||||
),
|
||||
onChanged: () {
|
||||
if (!gitAuthorKey.currentState.validate()) return;
|
||||
var gitAuthor = gitAuthorKey.currentState.value;
|
||||
if (!gitAuthorKey.currentState!.validate()) return;
|
||||
var gitAuthor = gitAuthorKey.currentState!.value;
|
||||
saveGitAuthor(gitAuthor);
|
||||
},
|
||||
);
|
||||
|
||||
var saveGitAuthorEmail = (String gitAuthorEmail) {
|
||||
var saveGitAuthorEmail = (String? gitAuthorEmail) {
|
||||
if (gitAuthorEmail == null) return;
|
||||
|
||||
settings.gitAuthorEmail = gitAuthorEmail;
|
||||
settings.save();
|
||||
};
|
||||
@ -140,8 +141,8 @@ class SettingsListState extends State<SettingsList> {
|
||||
hintText: tr('settings.email.hint'),
|
||||
labelText: tr('settings.email.label'),
|
||||
),
|
||||
validator: (String value) {
|
||||
value = value.trim();
|
||||
validator: (String? value) {
|
||||
value = value!.trim();
|
||||
if (value.isEmpty) {
|
||||
return tr('settings.email.validator.empty');
|
||||
}
|
||||
@ -157,8 +158,8 @@ class SettingsListState extends State<SettingsList> {
|
||||
initialValue: settings.gitAuthorEmail,
|
||||
),
|
||||
onChanged: () {
|
||||
if (!gitAuthorEmailKey.currentState.validate()) return;
|
||||
var gitAuthorEmail = gitAuthorEmailKey.currentState.value;
|
||||
if (!gitAuthorEmailKey.currentState!.validate()) return;
|
||||
var gitAuthorEmail = gitAuthorEmailKey.currentState!.value;
|
||||
saveGitAuthorEmail(gitAuthorEmail);
|
||||
},
|
||||
);
|
||||
@ -390,7 +391,7 @@ class SettingsListState extends State<SettingsList> {
|
||||
settings.storageLocation = "";
|
||||
} else {
|
||||
settings.storageLocation =
|
||||
await ICloudDocumentsPath.documentsPath;
|
||||
(await ICloudDocumentsPath.documentsPath)!;
|
||||
if (settings.storageLocation.isNotEmpty) {
|
||||
settings.storeInternally = false;
|
||||
}
|
||||
@ -592,19 +593,23 @@ Future<String> _getExternalDir() async {
|
||||
}
|
||||
|
||||
var path = await ExtStorage.getExternalStorageDirectory();
|
||||
if (await _isDirWritable(path)) {
|
||||
return path;
|
||||
} else {
|
||||
Log.e("ExtStorage: Got $path but it is not writable");
|
||||
if (path != null) {
|
||||
if (await _isDirWritable(path)) {
|
||||
return path;
|
||||
} else {
|
||||
Log.e("ExtStorage: Got $path but it is not writable");
|
||||
}
|
||||
}
|
||||
|
||||
var extDir = await getExternalStorageDirectory();
|
||||
path = extDir.path;
|
||||
if (extDir != null) {
|
||||
path = extDir.path;
|
||||
|
||||
if (await _isDirWritable(path)) {
|
||||
return path;
|
||||
} else {
|
||||
Log.e("ExternalStorageDirectory: Got $path but it is not writable");
|
||||
if (await _isDirWritable(path)) {
|
||||
return path;
|
||||
} else {
|
||||
Log.e("ExternalStorageDirectory: Got $path but it is not writable");
|
||||
}
|
||||
}
|
||||
|
||||
return "";
|
||||
|
Reference in New Issue
Block a user