2017-10-31 7 views
0

Page1ページが表示されるときに、name()関数を実行するにはどうすればよいですか?Flutter - ページが表示されたときに常に関数を実行します。

私は機能 name()が実行されていないバックボタンやAndroidの物理的なボタンをクリックして、私は 'go to Page1'ボタンをクリックすると機能 name()がある場合、私はすでに Page2内部 dispose() を実行 Page2に行く前に、以下のコードで

実行される。

Page1が表示されている場合、常にname()機能を実行するのに役立ちますか?

enter image description here

import 'package:flutter/material.dart'; 

void main() { 
    runApp(new MyApp()); 
} 

class MyApp extends StatelessWidget { 
    @override 
    Widget build(BuildContext context) { 
    return new MaterialApp(
     home: new MyHomePage(), 
     routes: <String, WidgetBuilder> { 
     '/page2': (BuildContext context) => new Page2(), 
     }, 
    ); 
    } 
} 

class MyHomePage extends StatefulWidget { 
    @override 
    _MyHomePageState createState() => new _MyHomePageState(); 
} 

class _MyHomePageState extends State<MyHomePage> { 
    String nameScreen; 

    String name() { 
    return 'foo1'; 
    } 

    @override 
    void initState() { 
    super.initState(); 
    this.nameScreen = name(); 

    } 

    @override 
    void dispose() { 
    this.nameScreen = ''; 
    super.dispose(); 
    } 

    @override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     appBar: new AppBar(
     title: new Text('Page 1'), 
     backgroundColor: new Color(0xFF26C6DA), 
    ), 
     body: new Center(
     child: new Column(
      mainAxisAlignment: MainAxisAlignment.center, 
      children: <Widget>[ 
      new RaisedButton(
       child: const Text('go to Page2'), 
       onPressed:() async { 
       dispose(); 
       bool isLoggedIn = await Navigator.of(context).pushNamed('/page2'); 
       if (isLoggedIn) { 
        setState((){ 
        this.nameScreen = name(); 
        }); 
       } 
       }, 
      ),    
      new Text(
       '$nameScreen',    
      ), 
      ], 
     ), 
    ), 
    ); 
    } 
} 

class Page2 extends StatelessWidget{ 
    @override 
    Widget build(BuildContext context) { 
    return new Scaffold( 
     appBar: new AppBar(
     title: new Text('Page 2'), 
     backgroundColor: new Color(0xFFE57373) 
    ), 
     body: new Center(
     child: new Column(
      mainAxisAlignment: MainAxisAlignment.center, 
      children: <Widget>[ 
      new RaisedButton(
       child: const Text('go back to Page1'), 
       onPressed:() { 
       Navigator.pop(context, true); 
       } 
      ), 
      ], 
     ), 
    ), 
    ); 
    } 
} 

答えて

1

disposeがロジックに変換されない木、から現在のオブジェクトを削除しますので、あなたがpopに喜んでいるときに、すべてのdisposeを呼び出して、後でStateを変更する必要はありませんあなたは開発しようとしています。

実際にBackButtonを無効にして、Navigator.pop(context, result)という同じ呼び出しを渡すことができます。次の例を確認してくださいnameScreenフィールドの各Stateの違いを表示するためにコードを微調整しました。これがあなたに役立つことを願っていますご協力いただきありがとうござい@azira

enter image description here

class MyHomePage extends StatefulWidget { 
    @override 
    _MyHomePageState createState() => new _MyHomePageState(); 
} 

class _MyHomePageState extends State<MyHomePage> { 
    String nameScreen = ""; 

    String name() { 
    return 'foo1'; 
    } 

    @override 
    void initState() { 
    super.initState(); 
    this.nameScreen = "From initState"; 

    } 

@override 
void dipose(){ 
    super.dispose(); 
} 

    @override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     appBar: new AppBar(
     title: new Text('Page 1'), 
     backgroundColor: new Color(0xFF26C6DA), 
    ), 
     body: new Center(
     child: new Column(
      mainAxisAlignment: MainAxisAlignment.center, 
      children: <Widget>[ 
      new RaisedButton(
       child: const Text('go to Page2'), 
       onPressed:() async { 
       //dispose(); ///No need for dispose 
       String result = await Navigator.of(context).pushNamed('/page2'); 

        setState((){ 
        this.nameScreen = result; 
        }); 

       }, 
      ), 
      new Text(
       '$nameScreen', 
      ), 
      ], 
     ), 
    ), 
    ); 
    } 
} 

class Page2 extends StatelessWidget{ 
    @override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     appBar: new AppBar(
      leading: new IconButton(icon: new Icon(Icons.arrow_back), onPressed:()async{ 
      Navigator.pop(context,"From BackButton"); 
      }), 
      title: new Text('Page 2'), 
      backgroundColor: new Color(0xFFE57373) 
    ), 
     body: new Center(
     child: new Column(
      mainAxisAlignment: MainAxisAlignment.center, 
      children: <Widget>[ 
      new RaisedButton(
       child: const Text('go back to Page1'), 
       onPressed:() { 
        Navigator.pop(context, "From RaisedButton"); 
       } 
      ), 
      ], 
     ), 
    ), 
    ); 
    } 
+0

、ユーザーは、Androidの物理的なボタンで戻ってきた場合にだけ機能していません。これを解決する方法はありますか? – rafaelcb21

+1

問題を解決する方法の1つは、ユーザーが物理的なAndroidボタンを使用する場合に 'setState'の上に' if(result == null){result = "Android back button";} 'を追加したことです – rafaelcb21

関連する問題