2017-11-02 3 views
1

この例のフラッタアプリは引き出しと引き出しを使用してナビゲートすることができる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()メソッドは呼び出され続けます。

明らかに何かが間違っていますか? - ここでは何が起こっていますか?

答えて

1

Navigator.of(context).pushNamed('/');のようなメソッドは、通常、新しいウィジェットを作成し、「プッシュ」します。あなたが新しい国を持っている理由は、それが理由かもしれません。

あなたはStocks app

+0

ええ、新しいウィジェットは大丈夫ですが、なぜ古い参照を保持していて、build()を実行し続けるのですか? –

+0

ありがとう、私は正しい方向に私を指摘した通りにこれを正しくマークしました - 2つの理由があります:1.両方のウィジェットが同じDrawerインスタンスを共有しています(Drawerは参照を永遠に(? 2.あなたが現在ナビゲートしようとしているページにいる場合は、(2番目の参照を取得しないように)ドロワをポップするだけです。しかし、ここでの主な問題は、私が言及した最初の問題だと思います。 –

1

フラッターに引き出しの例を見つけることができますが、あなたがプッシュし、各ルートのStateオブジェクトを作成し、そのbuild()方法あなたがナビゲーターのスタックに新しいルートをプッシュするたびに呼びかけています。あなたは現在、スタックから何かをポップする方法を提供していません。

ドロワーをSecondPageに指定しないでください。代わりに、戻るボタンを使用してユーザーがホームページに戻るように強制する必要があります。これにより、Navigator履歴スタックが任意に大きくなるのを防ぎます。

+0

Collinさん、ありがとうございました。引き出しが付いたメインページと、戻るボタンが付いているだけです。あなたの説明は理にかなっています。だから、もし私が引き出しで複数のルートを持っていたいのであれば、ナビゲートする前に引き出しがあれば、現在のルートをポップしなければならないだろう。 –

関連する問題