Flutter Widget重建的行为



我有一个简单的扑动程序,创建一个按钮列表。当我点击一个按钮时,按钮消失了,其他按钮向上移动了一个位置。我制作了几个版本,其中一个版本是第一次创建应用程序时,我准备了一个ElevatedButton Widgets列表,以便下次调用build()时,我返回已经创建的那些,这是一种缓存。当我在Android Studio中运行应用程序并在Flutter性能窗口上跟踪Widget重建时,即使使用旧的,它们也会被重建(参见调试打印)。很明显,这些小部件每次都是一样的,有人能解释一下这些小部件是否真的是重新创建的吗?在我的实现中会有什么好处吗?

import 'dart:async';
import 'package:get/get.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:should_rebuild/should_rebuild.dart';
void main() {
Get.put(Controller());
runApp(MaterialApp(home: HomePage()));
}
class Controller extends GetxController {
RxList<String> tutti = RxList();
List<ElevatedButton> righe = [];
List<int> posizioni = [];
void add(ElevatedButton r) {
righe.add(r);
posizioni.add(posizioni.length);
}
Widget at(int index) => righe[index];
@override
onInit() {
for (int i = 0; i < 10; i++) {
tutti.add('item $i');
}
}
void aggiorna(int index) {
for (int i = 0; i < posizioni.length; i++) {
// keep widget positios updated, if any widget before them in the list is removed
if (posizioni[i] == index) {
righe.removeAt(i);
tutti.removeAt(i);
posizioni.removeAt(i);
break;
}
}
}
}
class MyList extends StatelessWidget {
const MyList({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final Controller controller = Get.find();
return Obx(() => ListView.builder(
itemCount: controller.tutti.value.length,
itemBuilder: (context, index) {
if (index >= controller.righe.length) {
// missing, create a new one
print ('create button');
ElevatedButton r = ElevatedButton(
child: Text(controller.tutti.value[index]),
onPressed: () {
controller.aggiorna(index);
},
);
controller.add(r);
return r;
} else {
//     return existing
print ('reuse button');
return controller.at(index);
}
}));
}
}
class HomePage extends StatelessWidget {
HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('hello'),
),
body: Center(child: const MyList()));
}
}

你把你的控制器放在主函数中,所以当应用程序在开发中重建时,主函数将再次运行,这将覆盖所有以前的变量数据。

缓存可能会在发布模式下运行,但如果应用程序从内存中清除,它会丢失所有的状态/数据,所以你有按钮的列表是空的。

尽我所知,就我所了解的工作而言。如果你发现一些东西,否则说非常渴望学习,但我想这是最off的行为。

希望有帮助....

最新更新