ウィジェットのビルド/ロードが完了したら関数を実行できるようにしたいのですが、方法がわかりません。私の現在の使用例は、ユーザーが認証されているかどうかを確認し、認証されていない場合はログインビューにリダイレクトすることです。ログインビューまたはメインビューのいずれかを前に確認してプッシュしたくありません。メインビューがロードされた後に実行する必要があります。これを行うために使用できるものはありますか?
ウィジェットのビルド/ロードが完了したら関数を実行できるようにしたいのですが、方法がわかりません。私の現在の使用例は、ユーザーが認証されているかどうかを確認し、認証されていない場合はログインビューにリダイレクトすることです。ログインビューまたはメインビューのいずれかを前に確認してプッシュしたくありません。メインビューがロードされた後に実行する必要があります。これを行うために使用できるものはありますか?
回答:
あなたが使うことができます
https://github.com/slightfoot/flutter_after_layout
レイアウトが完了した後、関数を1回だけ実行します。または、その実装を見て、コードに追加してください:-)
これは基本的に
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
3つの可能な方法があります:
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
オブジェクトをと同じように処理できますが、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
SchedulerBindingを試してください。
SchedulerBinding.instance
.addPostFrameCallback((_) => setState(() {
isDataFetched = true;
}));
これを1回だけ実行する場合は、フレームワークがinitState()
作成するStateオブジェクトごとにメソッドを1回だけ呼び出すため、これを実行します。
@override
void initState() {
super.initState();
WidgetsBinding.instance
.addPostFrameCallback((_) => executeAfterBuildComplete(context));
}
戻るように何度もこれを実行したり、次の画面に移動したりするdidChangeDependencies()
場合などは、このStateオブジェクトの依存関係が変更されたときに呼び出されるため実行します。
たとえば、前の呼び出しが後で変更されたをbuild
参照したInheritedWidget
場合、フレームワークはこのメソッドを呼び出して、このオブジェクトに変更について通知します。
このメソッドは、の直後にも呼び出されinitState
ます。BuildContext.dependOnInheritedWidgetOfExactType
このメソッドから呼び出しても安全です。
@override
void didChangeDependencies() {
super.didChangeDependencies();
WidgetsBinding.instance
.addPostFrameCallback((_) => executeAfterBuildComplete(context));
}
これはあなたのコールバック関数です
executeAfterBuildComplete([BuildContext context]){
print("Build Process Complete");
}
build
。ビルドはいつでも複数回呼び出すことができます。