The argument type 'bool?' can't be assigned to the parameter type 'bool'

Issue

I am developing a Flutter App and I got the error The argument type 'bool?' can't be assigned to the parameter type 'bool'. How I solve it?

Here is the part of my Code where the error appears. I also google the error and they said, I shound change the products[key], to () => products[key],. But it doesn´t help. If you need more information, please ask.

void main() => runApp(MaterialApp(home: ToDo()));

class ToDo extends StatefulWidget {
  @override
  _ToDoState createState() => _ToDoState();
}

class _ToDoState extends State<ToDo> {
  Map<String, bool> products = {
    'ToDo': false, 'Java': false, 'Python': false, 'Schule': false, 'Hi': false
  };
  void addItem(String item) {
    setState(() {
      products[item] = false;
    });
    Navigator.of(context).pop();
  }
  
  void deleteItem(String key) {
    setState(() {
      products.remove(key);
    });
  }

  void toggleDone(String key) {
    setState(() {
      products.update(key, (bool done) => !done);
    });
  }

  void newEntry() {
    showDialog<AlertDialog>(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            content: TextField(
              onSubmitted: addItem,
            ),
          );
        }
      );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          'ToDo-App',
          style: TextStyle(
              color: Colors.black,
              fontSize: 18.0,
              fontFamily: 'Opinehe',
              fontWeight: FontWeight.w400,
              decoration: TextDecoration.underline),
        ),
        backgroundColor: Color.fromRGBO(35, 152, 185, 100),
      ),
      body: ListView.builder(
        itemCount: products.length,
        itemBuilder: (context, i) {
          String key = products.keys.elementAt(i);
          return SingleToDo(
              key,
              products[key],
              () => deleteItem(key),
              () => toggleDone(key),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: newEntry,
        child: Icon(Icons.add),
      ),
    );
  }
}
class SingleToDo extends StatelessWidget {
  final String title;
  final bool done;
  final Function remove;
  final Function toggleDone;
  const SingleToDo(this.title, this.done, this.remove, this.toggleDone);

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.symmetric(horizontal: 22),
      child: ListTile(
        contentPadding: EdgeInsets.symmetric(vertical: 8.0),
        leading: Checkbox(
          value: done,
          onChanged: (bool? value) => toggleDone(),
        ),
        title: Text(
          title,
          style: TextStyle(
              fontSize: 18.0,
              fontWeight: FontWeight.w300,
              color: Colors.black54),
        ),
        trailing: IconButton(
          icon: Icon(Icons.delete_outline),
          onPressed: () => remove(),
        )
      ),
    );
  }
}

Solution

From getting value can have null, on your mode class it is required non-nullable data.

You can check if value is null or not then pass value, or use default value if null like

products[key] ?? false,

Or use ! If you know that an expression never evaluates to null
products[key]!,

Check dart important-concepts

Answered By – Yeasin Sheikh

Answer Checked By – Marie Seifert (FlutterFixes Admin)

Leave a Reply

Your email address will not be published. Required fields are marked *