как добавить таймер в класс changenotifier

#flutter #dart #flutter-dependencies #flutter-provider

Вопрос:

Я использую пакет поставщика flutter для получения данных.

У меня есть 2 проблемы.

  1. В классе dataProvider я инициализировал и запустил его 3 раза, чтобы получить данные,
  2. Мне нужно обновить данные каждые 5 минут(я обновляю данные с помощью вызова api) как я могу это объяснить, я думаю, нужно добавить функцию таймера.где я могу их добавить.

`

 class DataProvider with ChangeNotifier {

      DataProvider() {
        getData();
 /*this will call 3 times when i call changenotifier provider in the ui*/
      }
    
      List<Data> _vData = [];
    //<Data> is my mode
      List<Data> get vData => _vData ;
    
       getData() async {
        try {
          _vData = await instatntApi().Services();
    // got the data from service
          notifyListeners();
          return _vData ;
        } catch (e) {
          print("error provider $e");
        }
      }
    }
 

`

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

 class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Container(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width,
          child: ChangeNotifierProvider<DataProvider>(
            create:
                (context) => DataProvider(),
            child:  Builder(
              builder: (
                context,
              ) {
                final model = Provider.of<DataProvider>(context);

                return ListView.builder(
                    itemCount: model.vData.length,
                    itemBuilder: (BuildContext context, int index) {
                      
                      return Center(
                        child: Text(
                          model.vData[index].text.toString(),
                          style: TextStyle(color: Colors.black),
                        ),
                      );
                    });
              },
            ),
          ),
        ),
      ),
    );
  }
}
 

Комментарии:

1. Мне нужно , чтобы вы опубликовали пользовательский интерфейс, который вызывает ваш Provider , потому что это, вероятно, причина тройного вызова. Вы используете a FutureBuilder и инициализируете future непосредственно в нем?

2. @venir Нет,я использую changeNotifierProvider в своем пользовательском интерфейсе

3. @venir Теперь я обновил часть пользовательского интерфейса в вопросе

4. Не могли бы вы опубликовать полную реализацию вашего Провайдера? Нам нужно глубже вникнуть в это .HomePageList и .data свойства, которых я не вижу в вашей реализации

5. извини, я забыл оценить твою работу,Спасибо, братан….

Ответ №1:

Вы можете попробовать Timer.periodic

 class DataProvider with ChangeNotifier {
   bool _call = false;
      DataProvider() {
        if(!_call){
           getData();
           _call = true;
        }
      }
    
      List<Data> _vData = [];
    
      List<Data> get vData => _vData ;
    
       getData() async {
        await processData();
         Timer.periodic(Duration(minute: 5), (t){
           processData();
         });
      }

      processData() async{
       try {
          _vData = await instatntApi().Services();
    // got the data from service
          notifyListeners();
        } catch (e) {
          print("error provider $e");
        }
      }
    }
 

Комментарии:

1. могу я узнать, почему это происходит, ожидайте технического ответа, братан, ты что-нибудь знал, в любом случае спасибо за твой ответ

2. тем не менее, он звонит 3-4 раза при первом вызове и запуске таймера