флаттер показывает черный экран при запуске после локализации

Мое приложение Flutter показывает черный экран в течение короткого периода времени сразу после заставки при запуске после того, как я попытался локализовать приложение. И я не уверен, в чем проблема. Проблема исчезла, когда я удалил локализацию. Приложение не дает сбоев, и проблема возникает как в режиме отладки, так и в режиме выпуска. Я видел это и другие решения, относящиеся к той же теме, но они не работали. Удалил приложение с телефонов (физический и эмулятор), затем перезапустил его, но оно не сработало. Я даже создал новое приложение и скопировал папку Android в старый проект, но проблема не была решена. Буду очень признателен, если кто-нибудь поможет мне это исправить. Я следовал руководству на Youtube, чтобы выполнить локализацию. В примере приложения также есть проблема.

      $ flutter doctor -v
[√] Flutter (Channel stable, 1.22.6, on Microsoft Windows [Version 10.0.18363.1379], locale 
    en-US)
    • Flutter version 1.22.6 at C:\flutter
    • Framework revision 9b2d32b605 (5 weeks ago), 2021-01-22 14:36:39 -0800
    • Engine revision 2f0af37152
    • Dart version 2.10.5

[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    • Android SDK at C:\Users\masan\AppData\Local\Android\sdk
    • Platform android-30, build-tools 30.0.3
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
    • All Android licenses accepted.

[!] Android Studio (version 4.1.0)
    • Android Studio at C:\Program Files\Android\Android Studio
    X Flutter plugin not installed; this adds Flutter specific functionality.
    X Dart plugin not installed; this adds Dart specific functionality.
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] VS Code (version 1.53.2)
    • VS Code at C:\Users\masan\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.19.0

[!] Connected device
    ! No devices available

! Doctor found issues in 2 categories.

AndroidManifest.xml

      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tomson.book.deputy">
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    
    <application
        android:label="Book App"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <meta-data
              android:name="io.flutter.embedding.android.SplashScreenDrawable"
              android:resource="@drawable/launch_background"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
       
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>
      import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class AppLocalizations {
  final Locale locale;
  Map<String, String> _localizedStrings;
  AppLocalizations(this.locale);

  static const LocalizationsDelegate<AppLocalizations> delegate =
      _AppLocalizationsDelegate();

  ///helper method to keep the code in the widgets concise
  /////localization are accessed using an InheritedWidget 'of'
  static AppLocalizations of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context, AppLocalizations);
  }

  ///load the language json file from the lang folder
  Future<void> load() async {
    String jsonStr =
        await rootBundle.loadString('lib/lang/${locale.languageCode}.json');

    Map<String, dynamic> jsonMap = json.decode(jsonStr);

    _localizedStrings = jsonMap.map((key, value) {
      return MapEntry(key, value.toString());
    });
  }

  ///called from every widget wich needs a localized text
  String translate(String key) {
    return _localizedStrings[key];
  }
}

class _AppLocalizationsDelegate
    extends LocalizationsDelegate<AppLocalizations> {
  const _AppLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) {
    return ['en', 'fr'].contains(locale.languageCode);
  }

  @override
  Future<AppLocalizations> load(Locale locale) async {
    AppLocalizations localizations = new AppLocalizations(locale);
    await localizations.load();
    return localizations;
  }

  @override
  bool shouldReload(_AppLocalizationsDelegate old) => false;
}

Заранее спасибо Сэм

1 ответ

Я только что столкнулся с той же проблемной ситуацией, что и вы, и у меня есть несколько замечаний для вашей справки. Я предполагаю, что вы применяете flutter_intl, чтобы включить интернационализацию приложения, поскольку асинхронный вызов будущего внутри сгенерированного метода S.load может быть основной причиной проблемной ситуации. Вы также можете ознакомиться с другим руководством по интернационализации в официальном flutter.dev, которое применяет реализацию SynchronousFuture внутри очень похожего сгенерированного метода _AppLocalizationsDelegate.load, чтобы избежать проблемы.

Другие вопросы по тегам