skip to Main Content

I’m a beginner to flutter please someone help!

Error: A value of type ‘bool?’ can’t be assigned to a variable of type ‘bool’ because ‘bool?’ is nullable and ‘bool’ isn’t.
color: isDone ? Color(0xFF7349FE) : Colors.transparent,

class TodoWidget extends StatelessWidget {
  final String? text;
  final bool? isDone;

  TodoWidget({this.text, @required this.isDone});

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.symmetric(
        horizontal: 24.0,
        vertical: 8.0,
      ),
      child: Row(
        children: [
          Container(
            width: 20.0,
            height: 20.0,
            margin: EdgeInsets.only(
              right: 12.0,
            ),
            decoration: BoxDecoration(
              color: isDone ? Color(0xFF7349FE) : Colors.transparent,
              borderRadius: BorderRadius.circular(6.0),
            ),
            child: Image(
              image: AssetImage(
                'assets/images/check_icon.png'
              ),
            ),
          ),
          Text(
              text ??"(Unnamed Todo)",
              style: TextStyle(
                color:  Color(0xFF211551),
                fontSize: 16.0,
                fontWeight: FontWeight.bold,
              ),
          ),

        ],
      ),
    );
  }
}

3

Answers


  1. Dart is a language which uses null safety. When you declaring bool? isDone; you are giving ? here. It means isDone boolean can be null ( It means it can contain null other than true or false ).So, when you are using this variable in a condition which only accepts true or false it may provide null.

    So, here the best thing to do is gave a default value to the isDone variable. Like
    bool isDone = false; . Don’t forgot to remove ?.

    Don’t forgot to gave tick if you find this helpful. Any doubts comment.

    Just change this:

    Before:
    bool? isDone;

    After:
    bool isDone = false; or bool isDone = true . It depends on your purpose.

    Login or Signup to reply.
  2. **Try like this way**
    
    class TodoWidget extends StatelessWidget {
     final String? text;
     final bool? isDone = false;
    
     TodoWidget({this.text, @required this.isDone});
    
    @override
    Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.symmetric(
        horizontal: 24.0,
        vertical: 8.0,
      ),
      child: Row(
        children: [
          Container(
            width: 20.0,
            height: 20.0,
            margin: EdgeInsets.only(
              right: 12.0,
            ),
            decoration: BoxDecoration(
              color: isDone ?? true ? Color(0xFF7349FE) : Colors.transparent,
              borderRadius: BorderRadius.circular(6.0),
            ),
            child: Image(
              image: AssetImage(
                'assets/images/check_icon.png'
              ),
            ),
          ),
          Text(
              text ??"(Unnamed Todo)",
              style: TextStyle(
                color:  Color(0xFF211551),
                fontSize: 16.0,
                fontWeight: FontWeight.bold,
              ),
          ),
    
        ],
      ),
    );
    }
    }
    
    Login or Signup to reply.
  3. A todo will always be done or not-done, there’s no case where a todo can be neither.

    So instead of keeping isDone nullable, keep a default value for isDone. This way you only have to code the widget for true or false cases, and not for the null case.

    change the declaration to make it non-nullable:

    final bool isDone;
    

    change the constructor to make it false by default:

    TodoWidget({this.text, this.isDone = false});
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search