programing

WidgetFlutterBinding.에서 보장하는 사항이니셜라이즈() do?

oldcodes 2023. 6. 8. 22:32
반응형

WidgetFlutterBinding.에서 보장하는 사항이니셜라이즈() do?

저는 아래 코드 라인의 파이어베이스 패키지를 사용하려고 합니다.

이 코드 라인이 실제로 무엇을 하는지 정말 알고 싶습니다.

공식 문서는 저에게 큰 도움이 되지 않았습니다.누가 설명 좀 해주시겠어요?

코드 조각

다음과 같은 방식으로 사용해야 합니다.

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

여기에 이미지 설명 입력

https://https.dev/dev/dll/adm/architecture-dll #architecture-delays

위의 이미지는 Flutter의 아키텍처 레이어입니다.WidgetFlutterBinding는 Floatter 엔진과 상호 작용하는 데 사용됩니다. Firebase.initializeApp()Firebase를 초기화하려면 네이티브 코드를 호출해야 하며, 플러그인은 플랫폼 채널을 사용하여 네이티브 코드를 호출해야 하므로 비동기식으로 수행되므로 호출해야 합니다.ensureInitialized()당신이 그 예를 확실히 가지고 있는지 확인하기 위해.WidgetsBinding.

문서에서:

위젯 바인딩의 인스턴스를 반환하고 필요한 경우 만들고 초기화합니다.작성된 경우 위젯 플러터 바인딩이 됩니다.하나가 이전에 초기화된 경우 위젯 바인딩을 구현합니다.

runApp을 호출하기 전에 바인딩을 초기화해야 하는 경우에만 이 메서드를 호출하면 됩니다.


소스 코드에서:

  @override
  Future<FirebaseAppPlatform> initializeApp(
      {String name, FirebaseOptions options}) async {
    if (name == defaultFirebaseAppName) {
      throw noDefaultAppInitialization();
    }

    // Ensure that core has been initialized on the first usage of
    // initializeApp
    if (!isCoreInitialized) {
      await _initializeCore();
    }

    // If no name is provided, attempt to get the default Firebase app instance.
    // If no instance is available, the user has not set up Firebase correctly for
    // their platform.
    if (name == null) {
      MethodChannelFirebaseApp defaultApp =
          appInstances[defaultFirebaseAppName];

      if (defaultApp == null) {
        throw coreNotInitialized();
      }

      return appInstances[defaultFirebaseAppName];
    }

    assert(options != null,
        "FirebaseOptions cannot be null when creating a secondary Firebase app.");

    // Check whether the app has already been initialized
    if (appInstances.containsKey(name)) {
      throw duplicateApp(name);
    }

    _initializeFirebaseAppFromMap(await channel.invokeMapMethod(
      'Firebase#initializeApp',
      <String, dynamic>{'appName': name, 'options': options.asMap},
    ));

    return appInstances[name];
  }

invokeMapMethod지정된 인수를 사용하여 위의 채널에서 메서드를 호출하고, 이 메서드는 다음을 호출합니다.initializeApp()네이티브 코드의 메소드, https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_core/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.java#L227


Firebase를 초기화하는 다양한 방법도 있습니다. 여기에서 확인할 수 있습니다.

Firebase App '[DEFAULT]'이 생성되지 않았습니다. Firebase를 호출합니다.Float 및 Firebase에서 App() 초기화

우리가 부르지 않는 다른 방법으로.WidgetsFlutterBinding.ensureInitialized()이래로runApp()함수는 내부적으로 호출합니다.

void runApp(Widget app) {
  WidgetsFlutterBinding.ensureInitialized()
    ..scheduleAttachRootWidget(app)
    ..scheduleWarmUpFrame();
}

https://github.com/flutter/flutter/blob/bbfbf1770c/packages/flutter/lib/src/widgets/binding.dart#L1012

간단한 대답은 Flutter가 runApp을 호출하기 전에 네이티브 코드를 호출해야 하는 경우입니다.

WidgetsFlutterBinding.ensureInitialized();

에서는 플랫폼 채널을 사용하여 기본 코드를 호출하는 데 필요한 위젯 바인딩 인스턴스가 있는지 확인합니다.

runApp을 호출하기 전에 바인딩을 초기화해야 하는 경우에만 이 메서드를 호출하면 됩니다.

간단한 답변입니다. 주 기능이 비동기 키워드를 사용하는 경우 이 줄을 사용해야 합니다. 이 줄 안에서 wait 문을 사용하기 때문입니다.

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  SharedPreferences prefs = await SharedPreferences.getInstance(); // just an example
}

언급URL : https://stackoverflow.com/questions/63873338/what-does-widgetsflutterbinding-ensureinitialized-do

반응형