Flutter 生成随机颜色便签时报实例成员无法在初始化器中访问错误如何解决
错误原因
- 你在声明
colorItem时直接引用了同类的实例成员color,Dart类的实例属性初始化顺序是先初始化字段再执行构造函数,初始化阶段实例属性还未创建完成,不能直接互相引用。 colorItem是实例属性,你在Widget中使用Sticky.colorItem属于静态访问,语法不成立。- 原Sticky构造函数将
color设为必传入参,和你预设颜色池随机取色的需求冲突。
修复后代码
import 'dart:math'; import 'package:flutter/cupertino.dart'; class Sticky { final String note; final Color color; // 预设颜色池设为静态常量,类级别初始化,所有实例共享 static const List<Color> _colorPool = [ Color(0xffB85252), Color(0xffB4C6A6), Color(0xffF4ABC4), Color(0xff346751), Color(0xffFFC947), Color(0xff3282B8), ]; static final Random _random = Random(); // 基础构造:随机取色,允许颜色重复 Sticky({required this.note}) : color = _colorPool[_random.nextInt(_colorPool.length)]; // 可选工厂构造:6个以内便签保证颜色完全不重复,超过6个自动重置颜色池 static List<Color> _remainingColors = List.from(_colorPool); factory Sticky.uniqueColor({required String note}) { if (_remainingColors.isEmpty) { _remainingColors = List.from(_colorPool); } final pickedColor = (_remainingColors..shuffle()).removeAt(0); return Sticky._(note: note, color: pickedColor); } Sticky._({required this.note, required this.color}); } class StickyNote extends StatelessWidget { final Color color; final String note; const StickyNote({Key? key, required this.color, required this.note}) : super(key: key); @override Widget build(BuildContext context) { return Container( width: 300, height: 300, color: color, child: Center(child: Text(note)), ); } }
使用示例
// 生成允许重复颜色的便签 final sticky1 = Sticky(note: "待办1"); final sticky2 = Sticky(note: "待办2"); // 生成不重复颜色的便签 final uniqueSticky1 = Sticky.uniqueColor(note: "专属便签1"); final uniqueSticky2 = Sticky.uniqueColor(note: "专属便签2"); // 渲染组件 StickyNote(color: sticky1.color, note: sticky1.note)
内容的提问来源于stack exchange,提问作者user17310705
相关产品推荐
相关产品推荐

