この例のフラッタアプリは引き出しと引き出しを使用してナビゲートすることができる2つの「ページ」(足場)で構成されていますウィジェットが表示されていないのにStateのbuild()メソッドが呼び出されるのはなぜですか?
import 'package:flutter/material.dart';
class MyTestDrawer extends StatefulWidget {
@override
_MyTestDrawerState createState() => new _MyTestDrawerState();
}
class _MyTestDrawerState extends State<MyTestDrawer> {
@override
Widget build(BuildContext context) {
return new Drawer(child: new ListView(
children: <Widget>[
new ListTile(
leading: new Icon(Icons.pregnant_woman),
title: new Text('Homepage'),
onTap:() {
Navigator.of(context).pushNamed('/');
}
),
new ListTile(
leading: new Icon(Icons.group),
title: new Text('Second page'),
onTap:() {
Navigator.of(context).pushNamed('/second');
}
),
new AboutListTile(
icon: new Icon(Icons.help)
)
]
)
);
}
}
final MyTestDrawer _drawer = new MyTestDrawer();
class FlutterTestApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Test',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new HomepageWidget(),
routes: <String, WidgetBuilder> {
'/second': (BuildContext context) => new SecondPage(),
}
);
}
}
class HomepageWidget extends StatefulWidget {
@override
_HomepageWidgetState createState() => new _HomepageWidgetState();
}
class _HomepageWidgetState extends State<HomepageWidget> {
@override
Widget build(BuildContext context) {
print('build: ' + this.toString());
return new Scaffold(
drawer: _drawer,
appBar: new AppBar(title: new Text('Homepage')),
body: new Container(
child: new Center(child: new Text('Homepage'))
)
);
}
}
class SecondPage extends StatefulWidget {
@override
_SecondPageState createState() => new _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
@override
Widget build(BuildContext context) {
print('build: '+ this.toString());
return new Scaffold(
drawer: _drawer,
appBar: new AppBar(title: new Text('Second page')),
body: new Container(
child: new Center(child: new Text('Second page'))
)
);
}
}
void main() {
runApp(new FlutterTestApp());
}
私はHomepageStateとSecondPageStateビルド()メソッドの両方でprint
デバッグ文を持っています。
私はこのアプリを実行し、ホームページと2ページ目間を移動すると、私は最終的に私のログにこれを取得する:
build: _HomepageWidgetState#e0d4a
build: _SecondPageState#06d69
build: _SecondPageState#9c9f7
build: _SecondPageState#db373
build: _SecondPageState#4d4ca
build: _SecondPageState#15247
build: _SecondPageState#06d69
build: _SecondPageState#9c9f7
build: _SecondPageState#db373
build: _SecondPageState#4d4ca
build: _HomepageWidgetState#0d598
build: _HomepageWidgetState#3bb96
build: _HomepageWidgetState#09270
build: _HomepageWidgetState#640bb
build: _HomepageWidgetState#6385a
build: _HomepageWidgetState#ed720
build: _HomepageWidgetState#f45da
新しいStateオブジェクトは、私が間を移動するたびに作成されているようですウィジェットが現在表示されていなくても、2つのページとbuild()メソッドは呼び出され続けます。
明らかに何かが間違っていますか? - ここでは何が起こっていますか?
ええ、新しいウィジェットは大丈夫ですが、なぜ古い参照を保持していて、build()を実行し続けるのですか? –
ありがとう、私は正しい方向に私を指摘した通りにこれを正しくマークしました - 2つの理由があります:1.両方のウィジェットが同じDrawerインスタンスを共有しています(Drawerは参照を永遠に(? 2.あなたが現在ナビゲートしようとしているページにいる場合は、(2番目の参照を取得しないように)ドロワをポップするだけです。しかし、ここでの主な問題は、私が言及した最初の問題だと思います。 –