2017-10-31 61 views
0

Page1 페이지가 나타날 때마다 name() 함수가 실행되도록하려면 어떻게해야합니까? 코드에서 Flutter - 페이지가 나타나면 항상 함수를 실행하십시오.

아래 Page2에 가기 전에 내가 뒤로 버튼이나 기능 name()가 실행되지 안드로이드의 물리적 버튼을 클릭하면 내가 Page2 내부에 이미 dispose() 실행,하지만 난 'go to Page1' 버튼을 클릭하면 기능 name()입니다 실행.

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는 논리로 번역하지 않는 트리에서 현재 개체를 제거하기 때문에, 나중에 State을 전혀 당신이 pop에 기꺼이 때 dispose를 호출하고 변경할 필요가 없습니다 당신은 발전하려고 노력하고 있습니다.

실제로 BackButton을 무시하고 동일한 Navigator.pop(context, result)을 전달할 수 있습니다. 다음 예제를 확인하십시오. nameScreen 필드의 각 State 사이의 차이점을 표시하기 위해 코드를 약간 수정했습니다. 나는 이것이 당신을 돕기를 바랍니다. 사용자가 다시 안드로이드의 물리적 버튼에 의해 오는 경우

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

@azira 감사 당신의 도움을 위해, 단지가 작동하지 않습니다. 이 문제를 해결할 방법이 있습니까? – rafaelcb21

+1

문제를 해결하는 한 가지 방법은 사용자가 실제 Android 버튼을 사용하는 경우'setState' 맨 위에'if (result == null) {result = "Android back button";}'을 추가하는 것입니다. – rafaelcb21