Не ставится галочка на CheckBoxListTile Flutter

Моя страница:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:ui';
import '../commons.dart';
import '../script.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  final GlobalKey<ScaffoldState> _homeScaffold = GlobalKey();
  Column postsColumn = Column(children: []);
  Column checkBoxesColumn = Column(children: [
    Text('Categories',
        textAlign: TextAlign.center,
        style: TextStyle(color: Colors.white, fontSize: 20))
  ]);

  @override
  void setState(VoidCallback fn) {
    super.setState(fn);
  }

  void initState() {
    super.initState();
    getPosts();
  }

  Widget build(BuildContext context) {
    return Scaffold(
      key: _homeScaffold,
      drawer: commonDrawer,
      endDrawer: commonEndDrawer,
      appBar: commonAppBar(_homeScaffold, 'Home'),
      body: ListView(
        children: [
          Categories(),
          
        ],
      ),
    );
  }
}

class Categories extends StatefulWidget {
  @override
  _CategoriesState createState() => _CategoriesState();
}
  bool somebool = true;

class _CategoriesState extends State<Categories> {
  dynamic columnCategories = Center(
      child: Container(
          width: 100, height: 100, child: CircularProgressIndicator()));

  fetchCategories() async {
    Column testColumn = Column(
      children: [
        Text('Categories',
            textAlign: TextAlign.center,
            style: TextStyle(
                color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold))
      ],
    );
    final response = await http.get(
        Uri.parse(
            'https://flutternerd.com/wp-json/wp/v2/categories?_embed&_fields=id,name'),
        headers: {"Accept": "application/json"});
    categories = jsonDecode(response.body);
    for (var categ in categories) {
        categ['checked']=false;
      testColumn.children.add(CheckboxListTile(
          title: Text(categ['name'],
              style: TextStyle(color: Colors.white, fontSize: 17)),
          value: categ['checked'],
          onChanged: (bool value) {
            setState(() {
              categ['checked'] = categ['checked']?false:true;
            });
          }));
    }
    setState(() {
      columnCategories = testColumn;
    });
  }


  @override
  void initState() {
    super.initState();
    fetchCategories();
  }

  
  Widget build(BuildContext context) {
    return columnCategories;
  }
}

Страница правильно получает категории через Wordpress REST API, проблема лишь в том, что при нажатии на checkbox вызывается функция onChanged (в виджете Categories()), но сама галочка не ставится. В чем проблема? Заранее спасибо!


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

Автор решения: MiT

Вы не меняете состояние у categ['checked'] в onChanged, вот рабочий пример как это должно быть.

import 'package:flutter/material.dart';

Map<String, dynamic> categ = {'checked': false};

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: const Center(
          child: MyStatefulWidget(),
        ),
      ),
    );
  }
}

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

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

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  @override
  Widget build(BuildContext context) {
    return CheckboxListTile(
      title: const Text('Animate Slowly'),
      value: categ['checked'],
      onChanged: (bool value) {
        setState(() {
          categ['checked'] = value;
        });
      },
      secondary: const Icon(Icons.hourglass_empty),
    );
  }
}
→ Ссылка