mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-26 16:46:51 +08:00
Settings Screens: Null safety++
This commit is contained in:
@ -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(
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 "";
|
||||||
|
Reference in New Issue
Block a user