mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
101 lines
2.7 KiB
Dart
101 lines
2.7 KiB
Dart
// Copyright 2014 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'package:meta/meta.dart';
|
|
import 'package:platform/platform.dart';
|
|
|
|
import '../convert.dart';
|
|
import 'file_system.dart';
|
|
import 'logger.dart';
|
|
import 'utils.dart';
|
|
|
|
/// A class to abstract configuration files.
|
|
class Config {
|
|
/// Constructs a new [Config] object from a file called [name] in the
|
|
/// current user's home directory as determined by the [Platform] and
|
|
/// [FileSystem].
|
|
factory Config(
|
|
String name, {
|
|
@required FileSystem fileSystem,
|
|
@required Logger logger,
|
|
@required Platform platform,
|
|
}) {
|
|
final File file = fileSystem.file(fileSystem.path.join(
|
|
_userHomePath(platform),
|
|
name,
|
|
));
|
|
return Config._(file, logger);
|
|
}
|
|
|
|
/// Constructs a new [Config] object from a file called [name] in
|
|
/// the given [Directory].
|
|
factory Config.test(
|
|
String name, {
|
|
@required Directory directory,
|
|
@required Logger logger,
|
|
}) => Config._(directory.childFile(name), logger);
|
|
|
|
Config._(File file, Logger logger) : _file = file, _logger = logger {
|
|
if (!_file.existsSync()) {
|
|
return;
|
|
}
|
|
try {
|
|
_values = castStringKeyedMap(json.decode(_file.readAsStringSync()));
|
|
} on FormatException {
|
|
_logger
|
|
..printError('Failed to decode preferences in ${_file.path}.')
|
|
..printError(
|
|
'You may need to reapply any previously saved configuration '
|
|
'with the "flutter config" command.',
|
|
);
|
|
_file.deleteSync();
|
|
}
|
|
}
|
|
|
|
/// The default name for the Flutter config file.
|
|
static const String kFlutterSettings = '.flutter_settings';
|
|
|
|
final Logger _logger;
|
|
|
|
File _file;
|
|
|
|
String get configPath => _file.path;
|
|
|
|
Map<String, dynamic> _values = <String, dynamic>{};
|
|
|
|
Iterable<String> get keys => _values.keys;
|
|
|
|
bool containsKey(String key) => _values.containsKey(key);
|
|
|
|
dynamic getValue(String key) => _values[key];
|
|
|
|
void setValue(String key, Object value) {
|
|
_values[key] = value;
|
|
_flushValues();
|
|
}
|
|
|
|
void removeValue(String key) {
|
|
_values.remove(key);
|
|
_flushValues();
|
|
}
|
|
|
|
void _flushValues() {
|
|
String json = const JsonEncoder.withIndent(' ').convert(_values);
|
|
json = '$json\n';
|
|
_file.writeAsStringSync(json);
|
|
}
|
|
|
|
// Reads the process environment to find the current user's home directory.
|
|
//
|
|
// If the searched environment variables are not set, '.' is returned instead.
|
|
//
|
|
// Note that this is different from FileSystemUtils.homeDirPath.
|
|
static String _userHomePath(Platform platform) {
|
|
final String envKey = platform.operatingSystem == 'windows'
|
|
? 'APPDATA'
|
|
: 'HOME';
|
|
return platform.environment[envKey] ?? '.';
|
|
}
|
|
}
|