You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter新手疑问:示例代码无main函数及导入库报错问题

问题解答与代码修正

1. 为什么代码里没有main函数?

这段代码只是一个可复用的StatefulWidget组件,并非完整的Flutter应用入口。Flutter应用的启动必须依赖main()函数作为程序入口点,这段代码的作用是被入口文件调用、作为页面展示的UI组件。

2. 导入库报错的原因

报错核心原因:

  • 导入的package:flutter_listtile_demo/model/listtilemodel.dart是自定义模型文件,但当前代码里已经把CheckBoxListTileModel类写在了同一个文件中,这个导入属于冗余且无效路径(你的项目里不存在这个文件结构),因此会报找不到文件的错误。
  • import 'package:flutter/foundation.dart';在当前代码中未被使用,也可直接删除。

3. 文件命名与内容规范建议

(1)文件拆分方案

  • 组件文件:命名为checkbox_listtile_demo.dart,存放CheckBoxListTileDemo及对应State类。
  • 模型文件(可选拆分):若要单独存放模型类,创建model/listtilemodel.dart文件,将CheckBoxListTileModel类移至此处。
  • 入口文件:必须存在main.dart,作为应用启动入口。

(2)完整可运行代码示例

main.dart(应用入口)

import 'package:flutter/material.dart';
import 'checkbox_listtile_demo.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'CheckboxListTile Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const CheckBoxListTileDemo(),
    );
  }
}

checkbox_listtile_demo.dart(组件文件)

import 'package:flutter/material.dart';
// 若拆分模型类,替换为:import 'model/listtilemodel.dart';

class CheckBoxListTileDemo extends StatefulWidget {
  const CheckBoxListTileDemo({super.key});

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

class CheckBoxListTileDemoState extends State<CheckBoxListTileDemo> {
  List<CheckBoxListTileModel> checkBoxListTileModel = CheckBoxListTileModel.getUsers();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        centerTitle: true,
        title: const Text(
          'CheckBox ListTile Demo',
          style: TextStyle(color: Colors.black),
        ),
      ),
      body: ListView.builder(
          itemCount: checkBoxListTileModel.length,
          itemBuilder: (BuildContext context, int index) {
            return Card(
              child: Container(
                padding: const EdgeInsets.all(10.0),
                child: Column(
                  children: <Widget>[
                    CheckboxListTile(
                        activeColor: Colors.pink[300],
                        dense: true,
                        title: Text(
                          checkBoxListTileModel[index].title,
                          style: const TextStyle(
                              fontSize: 14,
                              fontWeight: FontWeight.w600,
                              letterSpacing: 0.5),
                        ),
                        value: checkBoxListTileModel[index].isCheck,
                        secondary: Container(
                          height: 50,
                          width: 50,
                          child: Image.asset(
                            checkBoxListTileModel[index].img,
                            fit: BoxFit.cover,
                          ),
                        ),
                        onChanged: (bool? val) {
                          if (val != null) {
                            itemChange(val, index);
                          }
                        })
                  ],
                ),
              ),
            );
          }),
    );
  }

  void itemChange(bool val, int index) {
    setState(() {
      checkBoxListTileModel[index].isCheck = val;
    });
  }
}

// 若拆分模型类,将这段移至model/listtilemodel.dart中
class CheckBoxListTileModel {
  int userId;
  String img;
  String title;
  bool isCheck;

  CheckBoxListTileModel({required this.userId, required this.img, required this.title, required this.isCheck});

  static List<CheckBoxListTileModel> getUsers() {
    return <CheckBoxListTileModel>[
      CheckBoxListTileModel(
          userId: 1,
          img: 'assets/images/android_img.png',
          title: "Android",
          isCheck: true),
      CheckBoxListTileModel(
          userId: 2,
          img: 'assets/images/flutter.jpeg',
          title: "Flutter",
          isCheck: false),
      CheckBoxListTileModel(
          userId: 3,
          img: 'assets/images/ios_img.webp',
          title: "IOS",
          isCheck: false),
      CheckBoxListTileModel(
          userId: 4,
          img: 'assets/images/php_img.png',
          title: "PHP",
          isCheck: false),
      CheckBoxListTileModel(
          userId: 5,
          img: 'assets/images/node_img.png',
          title: "Node",
          isCheck: false),
    ];
  }
}

(3)额外注意事项

  • 图片资源:需在项目根目录创建assets/images文件夹,放入对应图片文件,并在pubspec.yaml中配置资源路径:
flutter:
  assets:
    - assets/images/
  • 代码优化:原代码onChanged参数可能为null,添加了非空判断;同时给构造函数参数加上required,符合Flutter空安全规范。

内容的提问来源于stack exchange,提问作者zeyzey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:10:31