Обновление вывода количества записей во Flutter

Изучаю Flutter, пишу программу по дизайну. Есть проблема, не могу решить её сам, опыта не хватает: на странице выводится поочередно блок с указанием количества полученных записей по API, а потом уже блок вывода списка. В начале инициализирую переменную _openTasks = 0 и указываю в виджете _countOpenTasks, а потом пытаюсь ее обновить когда начинаю обрабатывать список ниже (тогда и получаю количество записей), но если вместо ListView вывести Text(taskViewModel.tasks.length.toString) - выводит 6.

Помогите пожалуйста: как обновить вывод числа правильно без нажатий по кнопкам (как в примере) или как-то по другому это можно решить?

введите сюда описание изображения

Если пытаюсь вызвать setState в строке getCount(taskViewModel.tasks.length), то программа виснет.

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final now = DateTime.now();
  final dataAuth = GetStorage();
  late String _firstname;
  int _openTasks = 0;
  final int _closeTasks = 0;

  //Future<int> getCount(int count) async => _openTasks = count;
  void getCount(dynamic list) async {
    setState(() {
      _openTasks = list;
    });
  }

  @override
  void initState() {
    super.initState();
    final taskViewModel = Provider.of<TaskViewModel>(context, listen: false); // Fetches userViewModel object
    taskViewModel.fetchTasks(); // Calls the method to fetch the users
    //_openTasks = taskViewModel.tasks.length ?? 0;
    _firstname = dataAuth.read('firstname') ?? 'noname';
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return SafeArea(
      child: Container(
        padding: EdgeInsets.all(16),
        child: Column(
          children: [
            _welcomeUser(context),
            SizedBox(height: 16,),
            Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text(
                  'Сводка',
                  style: fs20BlackW500,
                ),
                SizedBox(height: 8,),
                Row(
                  children: [
                    _countOpenTasks(context),
                    SizedBox(
                      width: 8,
                    ),
                    _countCloseTasks(context),
                  ],
                )
              ],
            ),
            SizedBox(height: 16,),
            Row(
                mainAxisAlignment: MainAxisAlignment.start,
                children: [
                  Text('Задачи', style: fs20BlackW500,),
                ]
            ),
            SizedBox(height: 8,),
            Expanded(
              child: Consumer<TaskViewModel>( // Consumer widget to listen for changes in UserViewModel
                builder: (context, taskViewModel, child) {
                  if (taskViewModel.loading) { // If data is still loading, show a progress indicator
                    return const Center(child: CircularProgressIndicator(),);
                  } else if (taskViewModel.errorMessage.isNotEmpty) { // If there is an error, show the error message
                    return Center(child: Text(taskViewModel.errorMessage),);
                  } else {
                    //_openTasks = taskViewModel.tasks.length;
                    getCount(taskViewModel.tasks.length);
                    return ListView.separated(
                      scrollDirection: Axis.vertical,
                      shrinkWrap: true,
                      itemCount: taskViewModel.tasks.length,
                      separatorBuilder: (BuildContext context, int index) => SizedBox(height: 8,),
                      itemBuilder: (context, index) {
                        final task = taskViewModel.tasks[index];
                        return HomeItem(
                          id: task.id.toString(),
                          client: task.client_words,
                          numObject: task.object_number,
                          addressObject: task.object_address,
                          trouble: task.descript_task,
                          highImportance: task.high_importance,
                        );
                      },
                    );
                  }
                },
              ),
            ),
          ],
        ),
      ),
    );
  }

  Widget _welcomeUser(BuildContext context) {
    ....
  }

  Widget _countOpenTasks(BuildContext context) {
    return Expanded(
      child: Container(
        alignment: Alignment.centerLeft,
        padding: const EdgeInsets.all(10.0),
        decoration: BoxDecoration(
          border: Border.all(color: Color(0xFFDCE1EF), width: 2),
          borderRadius: BorderRadius.circular(12),
        ),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              "Ожидает задач",
              style: fs14GreyW500,
            ),
            Text(
              '$_openTasks',
              style: fs24BlackW600,
            ),
          ],
        ),
      ),
    );
  }

Ответы (1 шт):

Автор решения: Андрей Бондаренко

Все было просто: нужно было обернуть виджет Text в виджет класса Provider Consumer и никаких setState уже не надо:

Consumer<TaskViewModel>(
  builder: (context, taskViewModel, child) {
    return Text(
      taskViewModel.tasks.length.toString(),
      style: fs24BlackW600,
    );
  }
),
→ Ссылка