[dart] Flutter : 위젯 빌드 완료시 메서드 실행

위젯 빌드 /로드가 완료되면 함수를 실행하고 싶지만 방법을 잘 모르겠습니다. 내 현재 사용 사례는 사용자가 인증되었는지 확인하고 그렇지 않은 경우 로그인보기로 리디렉션하는 것입니다. 로그인 뷰나 메인 뷰를 미리 확인하고 푸시하고 싶지 않습니다. 메인 뷰가로드 된 후에 발생해야합니다. 이 작업을 수행하는 데 사용할 수있는 것이 있습니까?



답변

당신은 사용할 수 있습니다

https://github.com/slightfoot/flutter_after_layout

레이아웃이 완료된 후 한 번만 함수를 실행합니다. 또는 구현을 살펴보고 코드에 추가하십시오 🙂

기본적으로

  void initState() {
    super.initState();
    WidgetsBinding.instance
        .addPostFrameCallback((_) => yourFunction(context));
  }


답변

업데이트 : Flutter v1.8.4

언급 된 두 코드 모두 현재 작동합니다.

일:

WidgetsBinding.instance
        .addPostFrameCallback((_) => yourFunction(context));

import 'package:flutter/scheduler.dart';

SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));


답변

세 가지 방법이 있습니다.

1) WidgetsBinding.instance.addPostFrameCallback((_) => yourFunc(context));

2) Future.delayed(Duration.zero, () => yourFunc(context));

3) Timer.run(() => yourFunc(context));

의 경우 모든 위젯이 렌더링 된 후 context에서 사용하기 위해 필요했습니다 Scaffold.of(context).

그러나 내 겸손한 의견으로는 가장 좋은 방법은 다음과 같습니다.

void main() async {
  WidgetsFlutterBinding.ensureInitialized(); //all widgets are rendered here
  await yourFunc();
  runApp( MyApp() );
}


답변

Flutter 1.2-다트 2.2

공식 지침 및 소스 에 따라 레이아웃의 마지막 프레임 도 그려 졌는지 확인하려면 다음 과 같이 작성할 수 있습니다.

import 'package:flutter/scheduler.dart';

void initState() {
   super.initState();
   if (SchedulerBinding.instance.schedulerPhase == SchedulerPhase.persistentCallbacks) {
        SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
   }
}


답변

ReactNative componentDidMount와 동등한 것을 찾고 있다면 Flutter가 있습니다. 그렇게 간단하지는 않지만 똑같은 방식으로 작동합니다. Flutter에서 Widgets는 이벤트를 직접 처리하지 않습니다. 대신 그들은 State그것을하기 위해 그들의 물건을 사용 합니다.

class MyWidget extends StatefulWidget{

  @override
  State<StatefulWidget> createState() => MyState(this);

  Widget build(BuildContext context){...} //build layout here

  void onLoad(BuildContext context){...} //callback when layout build done
}

class MyState extends State<MyWidget>{

  MyWidget widget;

  MyState(this.widget);

  @override
  Widget build(BuildContext context) => widget.build(context);

  @override
  void initState() => widget.onLoad(context);
}

State.initState화면이 레이아웃 렌더링을 마치면 즉시 호출됩니다. 디버그 모드에있는 경우 핫 리로드시에도 명시 적으로 수행 할 시간에 도달 할 때까지 다시 호출되지 않습니다.


답변

Flutter 버전 1.14.6, Dart 버전 28.

아래는 나를 위해 일한 것입니다. 빌드 메소드 후에 발생하려는 모든 것을 별도의 메소드 또는 함수로 묶기 만하면됩니다.

@override
void initState() {
super.initState();
print('hello girl');

WidgetsBinding.instance
    .addPostFrameCallback((_) => afterLayoutWidgetBuild());

}


답변

가장 좋은 방법은

1. WidgetsBinding

WidgetsBinding.instance.addPostFrameCallback((_) {
      print("WidgetsBinding");
    });

2. WidgetsBinding

SchedulerBinding.instance.addPostFrameCallback((_) {
  print("SchedulerBinding");
});

내부 initState에서 호출 할 수 있으며 둘 다 빌드 위젯이 렌더링을 완료 한 후에 한 번만 호출됩니다.

@override
  void initState() {
    // TODO: implement initState
    super.initState();
    print("initState");
    WidgetsBinding.instance.addPostFrameCallback((_) {
      print("WidgetsBinding");
    });
    SchedulerBinding.instance.addPostFrameCallback((_) {
      print("SchedulerBinding");
    });
  }

위의 두 코드는 모두 유사한 바인딩 프레임 워크를 사용하므로 동일하게 작동합니다. 차이점은 아래 링크를 찾으십시오.

https://medium.com/flutterworld/flutter-schedulerbinding-vs-widgetsbinding-149c71cb607f