Запуск функции только один раз во время работы программы - PullRequest
0 голосов
/ 21 апреля 2020

Я создаю функцию с использованием rest api для get пользовательских данных с использованием его ID.

мой код в пользовательском интерфейсе:

  SharedPreferences sharedPreferences;
  UserApiService userApiService;

  @override
  void initState() {
    super.initState();
    getUserData();
    userApiService = UserApiService();
  }

  Future<User> getUserData() async {
    sharedPreferences = await SharedPreferences.getInstance();
    int id = sharedPreferences.getInt('id');
    return userApiService.getUser(id);
  }

мой код в api_service:

  Future<User> getUser(int id) async{
    final response = await client.get('$baseUrl/user/$id');
    if(response.statusCode == 200){
      return userFromJson(response.body);
    }else return null;
  }

вот мой FutureBuilder:

  @override
  Widget build(BuildContext context){
    return FutureBuilder(
      future: getUserData(),
      builder: (context, snapshot){
        if(!snapshot.hasData){
          return Scaffold(
            appBar: AppBar(
              backgroundColor: Colors.white,
              iconTheme: IconThemeData(color: Colors.black),
              title: Text('Profil', style: TextStyle(color: Colors.black, letterSpacing: 1),),
              elevation: 0.0,
              centerTitle: true,
              actions: <Widget>[
                IconButton(
                  icon: Icon(Icons.more_vert),
                  onPressed: () {
                    //
                  },
                )
              ],
              bottom: PreferredSize(child: Container(color: Colors.black, height: 0.1), preferredSize: Size.fromHeight(0.1),),
          ),
            body: Center(
              child: CircularProgressIndicator(),
            ),
          );
        }
        User user = snapshot.data;
        return Scaffold(
          backgroundColor: Colors.white,
          body: Container(
            child: Text(user.firstName),
          ),
        );
      },
    );
  }

И у меня есть проблема с тем фактом, что каждый раз, когда я go перехожу на страницу, где выполняется мой запрос, функция перезагружается и информация снова извлекается с сервера.

Как заставить эти данные загружаться из моего остатка API только один раз, а затем отображается плавно без необходимости делать еще один запрос к базе данных для этих данных.

Я знаю, что я должен использовать управление состоянием, но я не знаю, как это сделать.

Спасибо за любой ответ:)

1 Ответ

2 голосов
/ 21 апреля 2020

С https://github.com/flutter/flutter/issues/11426#issuecomment -414047398
Причина:

didUpdateWidget состояния FutureBuilder вызывается каждый раз, когда выдается пересборка. Эта функция проверяет, отличается ли старый объект будущего от нового, и, если так, обновляет FutureBuilder.

Решение:
Таким образом, вместо:

FutureBuilder(
  future: getUserData(),
....

У нас должно быть:

Future _future;

@override
initState() {
  super.initState();
  _future = getUserData();
}

, а затем

FutureBuilder(
  future: _future,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...