Как получить данные после перехода на другую страницу во флаттере - PullRequest
1 голос
/ 23 апреля 2020

Я хочу получить данные после публикации новых данных. Теперь мне нужно снова открыть приложение, чтобы получить вставленные данные. Как изображение, я покажу ниже. На домашней странице подробности получают из ответа JSON. Домашняя страница есть кнопка go до Добавить страницу данных . После того, как я нажму кнопку, чтобы go - добавить страницу данных , затем после добавления данных, которые электронная почта, имя пользователя I go, вернемся на мою домашнюю страницу с помощью Navigator.of (context). поп () ;. Проблема в том, что данные не обновлялись, мне нужно снова открыть приложение, чтобы увидеть вновь вставленные данные.

enter image description here

Вот код моей домашней страницы:

Future getDetails() async {
    http.Response response = await http.get(url);
    var decodedData = json.decode(response.body);

    setState(() {
      email= decodedData['email'];
      username= decodedData['username'];
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
       appBar: AppBar(title: Text('Home page'),
      ),
       body: SingleChildScrollView(
         child: Column(
         children: <Widget> [
          new Row(
            children: [
             Text('  Name: '+ username, style: TextStyle(fontSize: 16), textAlign: TextAlign.left,),
            Text('  Email : '+ email, style: TextStyle(fontSize: 16), textAlign: TextAlign.left,),
          ]
          ),
          new Row(
            children: [
              SizedBox(
                width: 350, 
                child: OutlineButton(
                  child: Text('ADD DATA'),
                  onPressed: () {Navigator.of(context).push(MaterialPageRoute(builder: (context) => AddPage()));},
                )
              )
            ]
          ),
          ]
          ),
       )
    );
  }

Вот мой код страницы добавления данных:

Future<void> addDetails() async {
    setState(() {
      loading = true;
    });

    http.Response response = await http.post(url, 
      body: {
        'username': usernameController.text,
        'email': emailController.text,
      }
    );
    setState(() {
      loading = true;
      Navigator.pop(context);
    });
  }

Кто-нибудь знает, как решить эту проблему? Спасибо.

Ответы [ 4 ]

1 голос
/ 23 апреля 2020

Сначала вы должны изменить Navigator # pu sh на await в результате использования метода Navigator # pop . Navigator # pop имеет подпись с другим параметром, который будет принят на домашней странице. Вы можете попробовать что-то подобное на своей домашней странице.

new Row(
   children: [
     SizedBox(
         width: 350, 
         child: OutlineButton(
            child: Text('ADD DATA'),
            onPressed: () async {
              final List<String> pageResult = await Navigator.of(context).push(MaterialPageRoute(builder: (context) => AddPage()));

              setState(() {
                email = pageResult[0];
                userName = pageResult[1];
              });
          },
        )
      )
   ]
);

А на другой своей странице сделать это в разделе pop:

setState(() {
  loading = false; //This is a bug in your code
  Navigator.pop(context, [emailController.text, userNameController.text]);
});
1 голос
/ 23 апреля 2020

Вызовите эту функцию внутри initState() на своей домашней странице:

WidgetsBinding.instance.addPostFrameCallback((_){ getDetails(); });

Редактировать: заменить pu sh следующим

Navigator.of(context).push(MaterialPageRoute(builder: (context) => AddPage())).then((_){getDetails();});
0 голосов
/ 23 апреля 2020

Я думаю, что есть способ решить вашу проблему:

1. Определите ваш HomePage, используя GlobalKey

. Вам нужно будет создать в отдельном файле (например, keys.dart) GlobalKey, который будет идентифицировать ваш HomePage виджет. Это сделает класс HomePageState publi c.

// In the keys.dart file
final GlobalKey<HomePageState> homePageKey = GlobalKey();

После создания ключа используйте его на AddDataPage следующим образом:

// Import your keys.dart file, and when Calling your HomePage in the build() method, specify the key
HomePage(
  key: homePageKey,
  ...
)

2. Используйте ключ, чтобы обновить sh ваш HomePage - когда это необходимо -

Теперь в вашем методе addDetails () вы можете использовать GlobalKey, чтобы обновить sh HomePage:

Future<void> addDetails() async {
    setState(() {
      loading = true;
    });

    http.Response response = await http.post(url, 
      body: {
        'email': emailController.text,
      }
    );

    // Make this setState callback async, and refresh your HomePage
    setState(() async {
      loading = false;
      await homePageKey.currentState.getDetails();
      Navigator.pop(context);
    });

    // Or you can also invert things (here the home page will be shown before refresh, useful if the getDetails() method show a kind of progress bar)
    // setState(() async {
    //   loading = false;
    //   await Navigator.pop(context);
    //   homePageKey.currentState.getDetails();
    // });

}

Надеюсь, это поможет!

0 голосов
/ 23 апреля 2020

Вы можете вернуть результат из выбранного маршрута на HomePage:

на странице добавления данных:

setState(() {
      loading = true;
      Navigator.pop(context,email);
    });

внутри HomePage:

OutlineButton(
      child: Text('ADD DATA'),
      onPressed: () async {
        final String returnedEmail = await Navigator.of(context)
            .push(MaterialPageRoute(builder: (context) => AddPage()));
        setState(()=>email = returnedEmail);
      },
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...