почему изменена статическая конечная переменная flutter

#flutter

Вопрос:

Я определяю статическую конечную переменную в flutter, используя пакет конфигурации, подобный этому:

 class GlobalConfig {
      static final GlobalConfiguration config = GlobalConfiguration();
}
 

насколько я понимаю, конфигурация должна начинаться один раз при загрузке класса, а затем оставаться неизменной все время, пока не закроется приложение. Но теперь конфигурация имеет другое значение при запуске приложения. Это заставляет меня иногда читать настройки успеха, иногда неудач. Это мой полный код класса GlobalConfig:

 import 'package:global_configuration/global_configuration.dart';

enum ConfigType { DEV, PRO }

class GlobalConfig {
  GlobalConfig(this.baseUrl, this.shareUrl, this.staticResourceUrl);

  static final GlobalConfiguration config = GlobalConfiguration();
  String baseUrl = config.get("baseUrl");
  String shareUrl = config.get("shareUrl");
  String staticResourceUrl = config.get("staticUrl");

  static getBaseUrl() {
    String configBaseUrl = config.get("baseUrl");
    return configBaseUrl;
  }

  static getShareUrl() {
    return config.get("shareUrl");
  }

  static getStaticResourceUrl() {
    return config.get("staticUrl");
  }

  static getConfig(String key) {
    return config.get(key);
  }

  static init(ConfigType configType) {
    switch (configType) {
      case ConfigType.DEV:
        break;
      case ConfigType.PRO:
        break;
    }
  }
}
 

есть ли какой-либо способ сделать конфигурацию такой же и не изменяться? или что я должен сделать, чтобы конфигурация чтения оставалась стабильной? Я хочу, чтобы конфигурация считала все успешно или все неудачно. это показатель успеха при списании долгов:

введите описание изображения здесь

это дебютирование с ошибкой чтения:

введите описание изображения здесь

точка останова была введена после завершения загрузки конфигурации приложения. Кстати, мой проект с открытым исходным кодом, весь исходный код отсюда. Основная логика заключается в том, что при воспроизведении музыки я отправляю http-запрос для сохранения информации о песнях на свой собственный сервер. функция: ReddwarfMusic.savePlayingMusic , эта функция считывает глобальную конфигурацию моего собственного URL-адреса сервера. Страница радио RM добавить фавират сохранить конфигурацию чтения успешно, но автосохранение из конфигурации чтения FM — радио не удалось. Я попытался сделать конфигурацию окончательной статичной, но не исправил ее. Поэтому я думаю несколько дней и не знаю, как заставить это работать.

пытался:

теперь я изменяю код следующим образом:

 import 'package:global_configuration/global_configuration.dart';

enum ConfigType { DEV, PRO }

class GlobalConfig {
  static Map config = Map<String, String>();

  GlobalConfig() {

  }

  static getBaseUrl() {
    String configBaseUrl = config["baseUrl"];
    return configBaseUrl;
  }

  static getShareUrl() {
    return config["shareUrl"];
  }

  static getStaticResourceUrl() {
    return config["staticUrl"];
  }

  static getConfig(String key) {
    return config[key];
  }

  static init(ConfigType configType) {
    var globalConfig = GlobalConfiguration();
    if (globalConfig.appConfig.isNotEmpty) {
      config = Map.unmodifiable(globalConfig.appConfig);
    }
    switch (configType) {
      case ConfigType.DEV:
        break;
      case ConfigType.PRO:
        break;
    }
  }
}
 

но конфигурация каждый раз кажется начальной. Сначала я установил успех конфигурации, но когда я использую, конфигурация изменилась на null.

введите описание изображения здесь

это исходный код:

 var globalConfig = GlobalConfiguration();
    if (globalConfig.appConfig.isNotEmpty) {
      config = Map.unmodifiable(globalConfig.appConfig);
    }
 

Я уверен, что начальная настройка прошла успешно.

Комментарии:

1.«Но теперь конфигурация имеет другое значение при запуске приложения». Можете ли вы точно описать, что вы наблюдаете, и показать код, который видит другое значение? Что значит «Это заставляет меня иногда читать об успехе, иногда о неудаче». в смысле? final предотвратит GlobalConfig.config переназначение на другой объект. Это не предотвратит мутацию объекта.

2. Я вставил пользовательский интерфейс debbugging, можно ли сделать конфигурацию неизменяемой после инициализации? что я должен сделать, чтобы приложение получило стабильную конфигурацию из конфигурации? @jamesdlin Я не хочу считывать другое значение из конфигурации, я хочу, чтобы возвращаемая конфигурация оставалась одинаковой при каждом чтении.

3.Нет, нет никакого способа изменить изменяемый объект на неизменяемый. В лучшем случае вы могли бы создать свою собственную, неизменяемую копию appConfig Map с помощью Map.unmodifiable конструктора, а затем использовать ее везде вместо GlobalConfiguration.appConfig .

Ответ №1:

Я, наконец, обнаружил, что один тип вызова был отправлен из pragma точки входа в фоновую службу, поэтому конфигурация также должна начинаться в фоновой службе. Это запись выглядит так:

 import 'package:flutter/material.dart';
import 'package:music_player/music_player.dart';
import 'package:quiet/app.dart';
import 'package:quiet/component.dart';
import 'package:quiet/repository/netease.dart';
import 'package:wheel/wheel.dart';

void main() {
  CommonUtils.initialApp(ConfigType.PRO).whenComplete(() => {loadApp(ConfigType.PRO)});
}

/// The entry of dart background service
/// NOTE: this method will be invoked by native (Android/iOS)
@pragma('vm:entry-point') // avoid Tree Shaking
void playerBackgroundService() {
  CommonUtils.initialApp(ConfigType.PRO).whenComplete(() => {
    loadRepository()
  });
}

void loadRepository() {
  WidgetsFlutterBinding.ensureInitialized();
  GlobalConfig.init(ConfigType.PRO);
  neteaseRepository = NeteaseRepository();
  runBackgroundService(
    imageLoadInterceptor: BackgroundInterceptors.loadImageInterceptor,
    playUriInterceptor: BackgroundInterceptors.playUriInterceptor,
    playQueueInterceptor: QuietPlayQueueInterceptor(),
  );
}
 

Я не знаю, почему фоновая служба не смогла прочитать конфигурацию.