Обновление вывода количества записей во 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,
);
}
),