Данные для страницы Flutter не загружаются при маршрутизации через MaterialPageRoute, но горячая перезагрузка загружает данные правильно? - PullRequest
0 голосов
/ 04 августа 2020

Я создаю приложение Flutter и у меня есть страница с таблицей, заполненной данными. Я загружаю данные так:

class _AccountMenuState extends State<AccountMenu> { {
  List<Account> accounts;

  Future<List<Account>> getAccounts() async {
    final response = await http.get('http://localhost:5000/accounts/' + globals.userId);
    return jsonDecode(response);
  }

  setAccounts() async {
    accounts = await getAccounts();
  }

  @override
  void initState() {
    setAccounts();
    super.initState();
  }
}

Это работает, как ожидалось, при горячей перезагрузке страницы, но когда я перенаправляюсь на эту страницу через MaterialPageRoute,

вот так: Navigator.push(context, MaterialPageRoute(builder: (context) => AccountMenu()));

значит данных нет

Что мне не хватает? Я думал, что initState() вызывается при загрузке страницы?

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Вы не можете выполнить setState внутри initState напрямую, но вы можете обернуть инициализацию внутри PostFrameCallback, чтобы убедиться, что жизненный цикл initState для Widget выполнен.

    class _AccountMenuState extends State<AccountMenu> { {
      List<Account> accounts;
    
      Future<List<Account>> getAccounts() async {
        final response = await http.get('http://localhost:5000/accounts/' + globals.userId);
        return jsonDecode(response);
      }
    
      setAccounts() async {
        accounts = await getAccounts();
        setState(() {})
      }
    
      @override
      void initState() {
        WidgetsBinding.instance.addPostFrameCallback((_) => setAccounts());
        super.initState();
      }
    }
0 голосов
/ 04 августа 2020

initState () не будет ждать выполнения setAccounts () до fini sh. В методе setAccounts () после загрузки данных вызываем setState.

 setAccounts() async {
    accounts = await getAccounts();
    setState((){});
  }
0 голосов
/ 04 августа 2020

initState не ожидает. Он загружает только функции перед построителем виджетов, но не ожидает. вам нужно дождаться загрузки виджетов с данными, пока account.length не станет пустым. Показать виджет загрузки, пока данные еще загружаются, или используйте FutureBuilder

List<Account> accounts;

@override
  void initState() {
    setAccounts();
    super.initState();
  }

@override
Widget build(BuildContext context) {
 accounts.length > 0 ? SHOW_DATA_HERE : LOADING_WIDGET_HERE
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...