как сопоставить данные списка API с одним флажком? в трепете

#flutter #checkbox

Вопрос:

Привет, я новичок в flutter, мне нужна помощь в получении данных API и отображении с флажком для выбора и отмены выбора. я использовал образец базы данных API, которая содержит информацию о 10 пользователях. Я хочу отобразить идентификатор пользователя, имя, имя пользователя, название компании и номер телефона в виде карточки или списка для каждого пользователя. Я также хочу установить один флажок на плитку карты/списка с функцией проверки / снятия флажка.

 import 'dart:convert';  import 'package:flutter/material.dart'; import 'package:flutter_application_http_get/example.dart'; import 'package:flutter_application_http_get/screen.dart'; import 'package:flutter_application_http_get/sunday_state.dart'; import 'package:http/http.dart' as http;  void main() {  runApp(MyApp()); }  class MyApp extends StatelessWidget {  // This widget is the root of your application.  @override  Widget build(BuildContext context) {  return MaterialApp(  title: 'Flutter Demo',  theme: ThemeData(  primarySwatch: Colors.blue,  ),  home: Sunday(),  );  } }  

Вот мой метод получения ApI

 class Sunday extends StatefulWidget {  const Sunday({Key? key}) : super(key: key);   @override  _SundayState createState() =gt; _SundayState(); }  class _SundayState extends Statelt;Sundaygt; {  var users = [];  Future getUserData() async {  var res =  await http.get(Uri.https("jsonplaceholder.typicode.com", "users"));  var jsonData = jsonDecode(res.body) as List;   setState(() {  users = jsonData;  });  }   @override  void initState() {  super.initState();  getUserData();  }   

вот мой метод сборки

 Widget build(BuildContext context) {  return Scaffold(  appBar: AppBar(  title: Text("User Data"),  ),  body: Container(  child: Card(  margin: EdgeInsets.all(20.0),  child: ListView.builder(  itemCount: users.length,  itemBuilder: (context, i) {  final post = users[i];   return Card(  elevation: 5,  child: Padding(  padding: const EdgeInsets.all(12.0),  child: ListView(shrinkWrap: true, children: [  // singlecheckbox(notification),  ...notification.map(singlecheckbox).toList(),  Text("${post['id']}"),  Text("${post['name']}"),    ])  

вот мой виджет для переключения флажка

 final notification = [SundayCheckBoxState()]; void togglegroupcheckbox(bool? value) {  if (value == null) return;  setState(() {  // notification.value = value;  notification.forEach((element) =gt; element.value = value);  });  }   Widget singlecheckbox(SundayCheckBoxState checkbox) {  return CheckboxListTile(  controlAffinity: ListTileControlAffinity.leading,  activeColor: Colors.green,  value: checkbox.value,  // title: Text('${users.last['name']}'),  onChanged: togglegroupcheckbox,     );  

Ответ №1:

Есть много вариантов, один из них-использовать a ListTile и добавлять a CheckBox в начало (или конец) каждой строки. Вы также должны отслеживать состояние каждого флажка, например, в вашем users списке.

Попробуйте определить свой ListView.builder так:

 ListView.builder(  itemCount: users.length,  itemBuilder: (context, i) {  final post = users[i];   return Card(  elevation: 5,  child: Padding(  padding: const EdgeInsets.all(12.0),  child: ListView(shrinkWrap: true, children: [  // singlecheckbox(notification),  //...notification.map(singlecheckbox).toList(),  ListTile(  isThreeLine: true,  leading: Checkbox(  value: post["checked"] ?? false,  onChanged: (bool? value) {  setState(() {  post["checked"] = value;  });  },  ),  title: Text(  "${post['name']}n${post['company']['name']}"),  subtitle: Text("${post['email']}"),  trailing: Text("${post['username']}"))  ])));  })  

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

1. спасибо за ваш ответ, это сработало!!!!

2. Приятно слышать, добро пожаловать. Возможно, вы захотите отметить мой ответ как принятый и / или проголосовать, если сочтете его полезным.