위젯 빌드 /로드가 완료되면 함수를 실행하고 싶지만 방법을 잘 모르겠습니다. 내 현재 사용 사례는 사용자가 인증되었는지 확인하고 그렇지 않은 경우 로그인보기로 리디렉션하는 것입니다. 로그인 뷰나 메인 뷰를 미리 확인하고 푸시하고 싶지 않습니다. 메인 뷰가로드 된 후에 발생해야합니다. 이 작업을 수행하는 데 사용할 수있는 것이 있습니까?
위젯 빌드 /로드가 완료되면 함수를 실행하고 싶지만 방법을 잘 모르겠습니다. 내 현재 사용 사례는 사용자가 인증되었는지 확인하고 그렇지 않은 경우 로그인보기로 리디렉션하는 것입니다. 로그인 뷰나 메인 뷰를 미리 확인하고 푸시하고 싶지 않습니다. 메인 뷰가로드 된 후에 발생해야합니다. 이 작업을 수행하는 데 사용할 수있는 것이 있습니까?
답변:
당신은 사용할 수 있습니다
https://github.com/slightfoot/flutter_after_layout
레이아웃이 완료된 후 한 번만 함수를 실행합니다. 또는 구현을 살펴보고 코드에 추가하십시오 :-)
기본적으로
void initState() {
super.initState();
WidgetsBinding.instance
.addPostFrameCallback((_) => yourFunction(context));
}
WidgetsBinding.instance.addPostFrameCallback((_) => yourFunciton(context));
더 이상 작동하지 않습니다
initState
, 예를 들어 이외의 다른 이름으로 호출해야합니다 . 에서 build
.
setState
내에서 호출해야합니다.yourFunction
업데이트 : Flutter v1.8.4
언급 된 두 코드 모두 현재 작동합니다.
일:
WidgetsBinding.instance
.addPostFrameCallback((_) => yourFunction(context));
일
import 'package:flutter/scheduler.dart';
SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
NoSuchMethodError (NoSuchMethodError: The method 'addPostFrameCallback' was called on null. Receiver: null
세 가지 방법이 있습니다.
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() );
}
공식 지침 및 소스 에 따라 레이아웃의 마지막 프레임 도 그려 졌는지 확인하려면 다음 과 같이 작성할 수 있습니다.
import 'package:flutter/scheduler.dart';
void initState() {
super.initState();
if (SchedulerBinding.instance.schedulerPhase == SchedulerPhase.persistentCallbacks) {
SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
}
}
ReactNative componentDidMount
와 동등한 것을 찾고 있다면 Flutter가 있습니다. 그렇게 간단하지는 않지만 똑같은 방식으로 작동합니다. Flutter에서 Widget
s는 이벤트를 직접 처리하지 않습니다. 대신 그들은 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
화면이 레이아웃 렌더링을 마치면 즉시 호출됩니다. 디버그 모드에있는 경우 핫 리로드시에도 명시 적으로 수행 할 시간에 도달 할 때까지 다시 호출되지 않습니다.
StatefulWidget
클래스를 사용 하여 State
객체를 a처럼 처리 할 수 StatelessWidget
있지만 권장하지는 않습니다. 나는 아직 어떤 문제도 발견하지 못했지만 State
먼저 객체 내부의 모든 것을 구현해보십시오
componentWillMount
레이아웃 렌더링 직전에 수행 할 수 있습니다 . Flutter는 더 간단한 솔루션을 제공합니다. 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
이 작업을 한 번만 수행하려면 프레임 워크가 initState()
생성하는 각 State 개체에 대해 정확히 한 번 메서드 를 호출하기 때문에 수행합니다 .
@override
void initState() {
super.initState();
WidgetsBinding.instance
.addPostFrameCallback((_) => executeAfterBuildComplete(context));
}
이 작업을 반복하거나 다음 화면 등으로 이동하려면 didChangeDependencies()
이 상태 개체의 종속성이 변경 될 때 호출 되기 때문에 수행하십시오 .
예를 들어 이전 호출 이 나중에 변경된를 build
참조하는 InheritedWidget
경우 프레임 워크는이 메서드를 호출하여이 개체에 변경 사항을 알립니다.
이 메서드는 initState
. BuildContext.dependOnInheritedWidgetOfExactType
이 메서드에서 호출 하는 것이 안전합니다 .
@override
void didChangeDependencies() {
super.didChangeDependencies();
WidgetsBinding.instance
.addPostFrameCallback((_) => executeAfterBuildComplete(context));
}
이것이 당신의 콜백 기능입니다.
executeAfterBuildComplete([BuildContext context]){
print("Build Process Complete");
}
build
. Build는 언제든지 여러 번 호출 할 수 있습니다.