简体   繁体   中英

Can't define the 'const' constructor because the field 'mylist' is initialized with a non-constant value

I found a problem, because I just learned the newest flutter, whereas what I learned was the old version of flutter.

when I make myList variable separate from Children

Errors:

Can't define the 'const' constructor because the field 'mylist' is initialized with a non-constant value.
Try initializing the field to a constant value, or removing the keyword 'const' from the constructor. [Ln 8, Col 3]

Can't define a const constructor for a class with non-final fields.
Try making all of the fields final, or removing the keyword 'const' from the constructor. [Ln 9, Col 9]

Script:

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  List<Widget> mylist = [
            Container(
              height: 300,
              width: 300,
              color: Colors.red,
            ),
            Container(
              height: 300,
              width: 300,
              color: Colors.green,
            ),
            Container(
              height: 300,
              width: 300,
              color: Colors.blue,
            ),
            Container(
              height: 300,
              width: 300,
              color: Colors.amber,
            ),
          ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("List View"),
        ),        
        body: ListView(
          //scrollDirection: Axis.horizontal,
          children: mylist,
        ),
      ),
    );
  }
}

Please help and explain the details of the problem and references

Remove the const keyword since MyApp() isn't a const ant:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  MyApp({super.key});
  List<Widget> mylist = [
    Container(
      height: 300,
      width: 300,
      color: Colors.red,
    ),
    Container(
      height: 300,
      width: 300,
      color: Colors.green,
    ),
    Container(
      height: 300,
      width: 300,
      color: Colors.blue,
    ),
    Container(
      height: 300,
      width: 300,
      color: Colors.amber,
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("List View"),
        ),
        body: ListView(
          //scrollDirection: Axis.horizontal,
          children: mylist,
        ),
      ),
    );
  }
}

For an explanation see: What is the difference between the "const" and "final" keywords in Dart?

If the value you have is computed at runtime (new DateTime.now(), for example), you can not use a const for it. However, if the value is known at compile time (const a = 1;), then you should use const over final. There are 2 other large differences between const and final. Firstly, if you're using const inside a class, you have to declare it as static const rather than just const. Secondly, if you have a const collection, everything inside of that is in const. If you have a final collection, everything inside of that is not final.

Well, because the mylist is mutable it means that it can be changed, and re-assignable, and the class which contains it can't be const anymore.

a const class is a class whose members are also const ( constant ).

so if you're willing to re-assign the mylist value in your code, then you need to remove the const keyword from your class constructor like this:

class MyApp extends StatelessWidget {
  MyApp({super.key}); // removed const
    List<Widget> mylist = [
 // ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM