【问题标题】:Multiple checkbox in Flutter from Json来自 Json 的 Flutter 中的多个复选框
【发布时间】:2020-03-06 11:21:23
【问题描述】:

我已经能够在 FutureBuilder Widget 中显示来自 API 的 json 数据。但是,小部件具有每个列表的复选框。每当我检查一个列表时,都会检查整个列表。

我需要有关如何单独检查每个列表并能够使用所选列表的数据的帮助。

import 'package:flutter/material.dart';

import 'dart:async';
import 'package:http/http.dart' as http;
import 'dart:convert';

class Location extends StatefulWidget {
  @override
  _LocationState createState() => _LocationState();
}

class _LocationState extends State<Location> {
  //initState
  bool selected = false;

  Future<List<User>> _getUsers() async {
    var data = await http
        .get("http://www.json-generator.com/api/json/get/cdjVKlMEde?indent=2");

    var jsonData = json.decode(data.body);

    List<User> users = [];

    for (var u in jsonData) {
      User user =
          User(u["index"], u["about"], u["name"], u["email"], u["picture"]);

      users.add(user);
    }

    print(users.length);

    return users;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Select City'),
      ),
         body: Container(
        child: FutureBuilder(
          future: _getUsers(),
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            print(snapshot.data);
            if (snapshot.data == null) {
              return Container(child: Center(child: Text("Loading...")));
            } else {
              return ListView.builder(
                itemCount: snapshot.data.length,
                itemBuilder: (BuildContext context, int index) {
                  return ListTile(
                    leading: CircleAvatar(
                      backgroundImage:
                          NetworkImage(snapshot.data[index].picture),
                    ),
                    title: Text(snapshot.data[index].name),
                    subtitle: Text(snapshot.data[index].email),
                    trailing: Checkbox(
                        value: selected,
                        onChanged: (bool val) {
                          setState(() {
                            selected = val;
                          });
                        }),
                    onTap: () {
                      Navigator.push(
                          context,
                          new MaterialPageRoute(
                              builder: (context) =>
                                  DetailPage(snapshot.data[index])));
                    },
                  );
                },
              );
            }
          },
        ),
      ),
    );
  }
}

class DetailPage extends StatelessWidget {
  final User user;

  DetailPage(this.user);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
      title: Text(user.name),
    ));
  }
}

class User {
  final int index;
  final String about;
  final String name;
  final String email;
  final String picture;

  User(this.index, this.about, this.name, this.email, this.picture);
}

我需要有关如何单独检查每个列表并能够使用所选列表的数据的帮助。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我解决了这个问题,请尝试运行以下代码。

    说明

    • 初始化一个bool类型列表

      var userStatus = List();

    • 在添加用户时将布尔值false添加到列表中,如下代码所示

      userStatus.add(false)

    • 现在在复选框处设置一个值

      值:userStatus[index]

    • 在checkbox的onChanged事件中,通过set state来切换用户状态

      userStatus[index] = !userStatus[index];

    import 'package:flutter/material.dart';
    import 'dart:async';
    import 'package:http/http.dart' as http;
    import 'dart:convert';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: Location(),
        );
      }
    }
    
    
    class Location extends StatefulWidget {
      @override
      _LocationState createState() => _LocationState();
    }
    
    class _LocationState extends State<Location> {
      //initState
      bool selected = false;
      var userStatus = List<bool>();
    
      Future<List<User>> _getUsers() async {
        var data = await http
            .get("http://www.json-generator.com/api/json/get/cdjVKlMEde?indent=2");
    
        var jsonData = json.decode(data.body);
    
        List<User> users = [];
    
        for (var u in jsonData) {
          User user =
          User(u["index"], u["about"], u["name"], u["email"], u["picture"]);
    
          users.add(user);
          userStatus.add(false);
        }
    
        print(users.length);
    
        return users;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Select City'),
          ),
          body: Container(
            child: FutureBuilder(
              future: _getUsers(),
              builder: (BuildContext context, AsyncSnapshot snapshot) {
                print(snapshot.data);
                if (snapshot.data == null) {
                  return Container(child: Center(child: Text("Loading...")));
                } else {
                  return ListView.builder(
                    itemCount: snapshot.data.length,
                    itemBuilder: (BuildContext context, int index) {
                      return ListTile(
                        leading: CircleAvatar(
                          backgroundImage:
                          NetworkImage(snapshot.data[index].picture),
                        ),
                        title: Text(snapshot.data[index].name),
                        subtitle: Text(snapshot.data[index].email),
                        trailing: Checkbox(
                            value: userStatus[index],
                            onChanged: (bool val) {
                              setState(() {
                                userStatus[index] = !userStatus[index];
                              });
                            }),
                        onTap: () {
                          Navigator.push(
                              context,
                              new MaterialPageRoute(
                                  builder: (context) =>
                                      DetailPage(snapshot.data[index])));
                        },
                      );
                    },
                  );
                }
              },
            ),
          ),
        );
      }
    }
    
    class DetailPage extends StatelessWidget {
      final User user;
    
      DetailPage(this.user);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text(user.name),
            ));
      }
    }
    
    class User {
      final int index;
      final String about;
      final String name;
      final String email;
      final String picture;
    
      User(this.index, this.about, this.name, this.email, this.picture);
    }
    

    【讨论】:

    • 谢谢。它工作得很好。请问即使重新启动应用程序,如何使选择持续存在以及如何在另一个屏幕中解析数据?
    • 使用共享首选项,它将为简单数据提供持久存储。
    • 如果您没有找到任何解决方案,我会给您详细的解释。
    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多