flutter - 屏幕上的内容每次都成倍增加,屏幕正在初始化(SQLite,颤振)
问题描述
数据库渲染的元素每次都在屏幕上成倍增加,我点击屏幕然后返回屏幕。
这是在屏幕上创建这些元素的代码:
class AlarmScreen extends StatefulWidget {
const AlarmScreen({Key? key}) : super(key: key);
@override
_AlarmScreenState createState() => _AlarmScreenState();
}
class _AlarmScreenState extends State<AlarmScreen> {
AlarmHelper _alarmHelper = AlarmHelper();
Future<List<AlarmInfo>>? _alarms;
@override
void deactivate() {
super.deactivate();
}
@override
void initState() {
_alarmHelper.initializeDatabase().then((value) => print('------------dB initialized'));
_alarms = _alarmHelper.getAlarm();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color(0xFF2D2F41),
appBar: PreferredSize(preferredSize: Size.fromHeight(50),
child: CustomAppBar("Alarm")),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget> [
Expanded(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 45, vertical: 10),
child: FutureBuilder<List<AlarmInfo>>(
future: _alarms,
builder: (context, snapshot)
{
if(snapshot.hasData){
return ListView(
children: snapshot.data!.map<Widget>((alarms) {
return Container(
margin: EdgeInsets.only(bottom: 32),
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Icon(Icons.label, color: Colors.white, size:
24,),
SizedBox(width: 8,),
Text(alarms.title, style: TextStyle(color:
Colors.white, fontFamily: 'avenir'),),
],
),
Switch(value: alarms.isPending == 1 ? true : false, onChanged: (bool value){},
activeColor: Colors.white,)
],
),
Text('Mon-Fri', style: TextStyle(color:
Colors.white, fontFamily: 'avenir'),),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text( alarms.dateTime.hour.toString().padLeft(2, "0") + ":" + alarms.dateTime.minute.toString().padLeft(2, "0") , style: TextStyle(color:
Colors.white, fontFamily: 'avenir',
fontWeight: FontWeight.w700,
fontSize: 24),),
IconButton(onPressed: (){
_alarmHelper.deleteAlarm(alarms.id);
setState(() {
});
}, icon: Icon(Icons.delete, color: Colors.white, size: 24,))
],
),
],
),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: GradientColors.sunset,
begin: Alignment.centerLeft,
end: Alignment.centerRight
),
borderRadius: BorderRadius.all(Radius.circular(24)),
boxShadow: [
BoxShadow(
color: GradientColors.sunset.last.withOpacity(0.4),
blurRadius: 5, spreadRadius: 2, offset: Offset(4,4)
)
]
),
);
}).followedBy([
DottedBorder(
child: Container(
decoration: BoxDecoration(
color: Color(0xff3C3F69),
borderRadius: BorderRadius.all(Radius.circular(24))
),
alignment: Alignment.center,
// color: Colors.red,
height: 110,
child: MaterialButton(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Icon(Icons.control_point, color: Colors.white,
size: 30,),
SizedBox(height: 8,),
Center(
child: Text('Add Alarm', style: TextStyle(
fontSize: 15, fontFamily: 'avenir',
color: Colors.white,
fontWeight: FontWeight.w700,
),),
)
],
mainAxisAlignment: MainAxisAlignment.center,
),
onPressed: (){
Navigator.push(context, MaterialPageRoute(builder: (context){
return AddAlarmScreen();
}));
},
),
),
strokeWidth: 3,
color: Colors.white,
borderType: BorderType.RRect,
radius: Radius.circular(24),
dashPattern: [6, 6, 6],
),
]).toList(),
);}
else{
return Center(
child: Text('Loading...', style: TextStyle(
color: Colors.white,
fontSize: 20
),),
);
}
}
),
),
),
],
)
);
}
}
这是我的 alarmHelper 代码:
final String tableName = 'alarm';
final String id = 'id';
final String title = 'title';
final String dateTime = 'dateTime';
final String color = 'gradientColorIndex';
final String isPending = 'isPending';
class AlarmHelper{
static Database? _database;
static AlarmHelper? _alarmHelper;
AlarmHelper._createInstance();
factory AlarmHelper() {
if (_alarmHelper == null){
_alarmHelper = AlarmHelper._createInstance();
}
return _alarmHelper!;
}
Future<Database?> get database async{
if (_database == null){
_database = await initializeDatabase();
}
return _database!;
}
Future<Database> initializeDatabase() async{
var dir = await getDatabasesPath();
var path = dir + "alarm.db";
var database = await openDatabase(path, version: 1, onCreate: (db, version){
db.execute('''
create table $tableName(
$id integer primary key autoincrement,
$title text not null,
$dateTime text not null,
$color integer,
$isPending integer not null
)
''');
}
);
return database;
}
void insetAlarm(AlarmInfo alarmInfo) async{
var db = await this.database;
var result = await db?.insert(tableName, alarmInfo.toMap());
print(result);
}
Future<List<AlarmInfo>> getAlarm() async{
var result;
var db = await this.database;
result = await db?.query(tableName);
result.forEach((element) {
var alarmInfo = AlarmInfo.fromMap(element);
alarms.add(alarmInfo);
}
);
return alarms;
}
void deleteAlarm(idOfAlarm) async{
var db = await this.database;
db?.delete(tableName, where: 'id = ?', whereArgs: [idOfAlarm]);
}
}
更详细的问题是,这是当前带有单个警报的屏幕。
但是当我点击离开屏幕并重新打开它时,我会看到两次相同的元素,并且每次点击离开屏幕并重新打开它时,这个数字都会增加 1,这就是它的样子。
解决方案
的代码AlarmHelper
不完整,但看起来alarms.add(alarmInfo);
您正在将新项目添加到alarms
列表中,因此每次新调用getAlarms()
都会返回一个包含更多项目的列表。
推荐阅读
- python - 在python中删除joblibmem映射文件夹的Windows权限错误
- python - 我的字符串没有被读取,但是我的整数是
- javascript - 开始 Javascript 表单验证
- python - 根据 Pandas 中的另一个 DataFrame 修改 DataFrame
- automapper - 使用 AutoMapper 合并对象
- javascript - JQuery - 如何将按钮添加到表中的列
- ios - 验证收据 iOS
- ios - 购买后收据中没有包含免费试用的 StoreKit 订阅(tx id 减 1)
- java - 如何从不同级别的 div 定义 xpath
- c++ - while循环的迭代返回奇怪的值