- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前我正在使用 flutter 包'Reorderables'来显示一个可重新排序的 ListView ,其中包含几个图像。这些图像可以通过一个按钮从 ListView 中删除,一切正常。但是每次我删除图像时都会重建 ListView 。我正在使用一个名为“ReorderableListviewManager”的类和 ChangeNotifier 来更新图像和 Provider.of<ReorderableListviewManager>(context)
获取最新图像。现在的问题是使用 Provider.of<ReorderableListviewManager>(context)
使build()
每次我删除图像时都会调用,因此 ListView 会重新构建。我哭了
可以使用消费者只重建部分小部件树,但似乎没有地方可以将消费者放入children
此 ListView 的。有没有办法只重建图像而不是整个 ReorderableListview ?非常感谢!
下面是我的代码:
class NotePicturesEditScreen extends StatefulWidget {
final List<Page> notePictures;
final NotePicturesEditBloc bloc;
NotePicturesEditScreen({@required this.notePictures, @required this.bloc});
static Widget create(BuildContext context, List<Page> notePictures) {
return Provider<NotePicturesEditBloc>(
create: (context) => NotePicturesEditBloc(),
child: Consumer<NotePicturesEditBloc>(
builder: (context, bloc, _) =>
ChangeNotifierProvider<ReorderableListviewManager>(
create: (context) => ReorderableListviewManager(),
child: NotePicturesEditScreen(
bloc: bloc,
notePictures: notePictures,
),
)),
dispose: (context, bloc) => bloc.dispose(),
);
}
@override
_NotePicturesEditScreenState createState() => _NotePicturesEditScreenState();
}
class _NotePicturesEditScreenState extends State<NotePicturesEditScreen> {
PreloadPageController _pageController;
ScrollController _reorderableScrollController;
List<Page> notePicturesCopy;
int longPressIndex;
List<double> smallImagesWidth;
double scrollOffset = 0;
_reorderableScrollListener() {
scrollOffset = _reorderableScrollController.offset;
}
@override
void initState() {
Provider.of<ReorderableListviewManager>(context, listen: false)
.notePictures = widget.notePictures;
notePicturesCopy = widget.notePictures;
_reorderableScrollController = ScrollController();
_pageController = PreloadPageController();
_reorderableScrollController.addListener(_reorderableScrollListener);
Provider.of<ReorderableListviewManager>(context, listen: false)
.getSmallImagesWidth(notePicturesCopy, context)
.then((imagesWidth) {
smallImagesWidth = imagesWidth;
});
super.initState();
}
@override
void dispose() {
_pageController.dispose();
_reorderableScrollController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
ReorderableListviewManager reorderableManager =
Provider.of<ReorderableListviewManager>(context, listen: false);
return SafeArea(
child: Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
shape: Border(bottom: BorderSide(color: Colors.black12)),
iconTheme: IconThemeData(color: Colors.black87),
elevation: 0,
automaticallyImplyLeading: false,
titleSpacing: 0,
centerTitle: true,
title: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
child: IconButton(
padding: EdgeInsets.only(left: 20, right: 12),
onPressed: () => Navigator.of(context).pop(),
icon: Icon(Icons.close),
),
),
Text('編輯',
style: TextStyle(color: Colors.black87, fontSize: 18))
],
),
actions: <Widget>[
FlatButton(
onPressed: () {},
child: Text(
'下一步',
),
)
],
),
backgroundColor: Color(0xffeeeeee),
body: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Spacer(),
StreamBuilder<List<Page>>(
initialData: widget.notePictures,
stream: widget.bloc.notePicturesStream,
builder: (context, snapshot) {
notePicturesCopy = snapshot.data;
return Container(
margin: EdgeInsets.symmetric(horizontal: 20),
height: MediaQuery.of(context).size.height * 0.65,
child: PreloadPageView.builder(
preloadPagesCount: snapshot.data.length,
controller: _pageController,
itemCount: snapshot.data.length,
onPageChanged: (index) {
reorderableManager.updateCurrentIndex(index);
reorderableManager.scrollToCenter(
smallImagesWidth,
index,
scrollOffset,
_reorderableScrollController,
context);
},
itemBuilder: (context, index) {
return Container(
child: Image.memory(
File.fromUri(
snapshot.data[index].polygon.isNotEmpty
? snapshot.data[index]
.documentPreviewImageFileUri
: snapshot.data[index]
.originalPreviewImageFileUri)
.readAsBytesSync(),
gaplessPlayback: true,
alignment: Alignment.center,
),
);
}),
);
},
),
Spacer(),
Container(
height: MediaQuery.of(context).size.height * 0.1,
margin: EdgeInsets.symmetric(horizontal: 20),
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: ReorderableRow(
scrollController: _reorderableScrollController,
buildDraggableFeedback: (context, constraints, __) =>
Container(
width: constraints.maxWidth,
height: constraints.maxHeight,
child: Image.memory(File.fromUri(
notePicturesCopy[longPressIndex]
.polygon
.isNotEmpty
? notePicturesCopy[longPressIndex]
.documentPreviewImageFileUri
: notePicturesCopy[longPressIndex]
.originalPreviewImageFileUri)
.readAsBytesSync()),
),
onReorder: (oldIndex, newIndex) async {
List<Page> result = await widget.bloc.reorderPictures(
oldIndex,
newIndex,
reorderableManager.notePictures);
_pageController.jumpToPage(newIndex);
reorderableManager.updateNotePictures(result);
reorderableManager
.getSmallImagesWidth(result, context)
.then((imagesWidth) {
smallImagesWidth = imagesWidth;
});
},
footer: Container(
width: 32,
height: 32,
margin: EdgeInsets.only(left: 16),
child: SizedBox(
child: FloatingActionButton(
backgroundColor: Colors.white,
elevation: 1,
disabledElevation: 0,
highlightElevation: 1,
child: Icon(Icons.add, color: Colors.blueAccent),
onPressed: notePicturesCopy.length >= 20
? () {
Scaffold.of(context)
.showSnackBar(SnackBar(
content: Text('筆記上限為20頁 !'),
));
}
: () async {
List<Page> notePictures =
await widget.bloc.addPicture(
reorderableManager.notePictures);
List<double> imagesWidth =
await reorderableManager
.getSmallImagesWidth(
notePictures, context);
smallImagesWidth = imagesWidth;
reorderableManager.updateCurrentIndex(
notePictures.length - 1);
reorderableManager
.updateNotePictures(notePictures);
_pageController
.jumpToPage(notePictures.length - 1);
},
),
),
),
children: Provider.of<ReorderableListviewManager>(
context)
.notePictures
.asMap()
.map((index, page) {
return MapEntry(
index,
Consumer<ReorderableListviewManager>(
key: ValueKey('value$index'),
builder: (context, manager, _) =>
GestureDetector(
onTapDown: (_) {
longPressIndex = index;
},
onTap: () {
reorderableManager.scrollToCenter(
smallImagesWidth,
index,
scrollOffset,
_reorderableScrollController,
context);
_pageController.jumpToPage(index);
},
child: Container(
margin: EdgeInsets.only(
left: index == 0 ? 0 : 12),
decoration: BoxDecoration(
border: Border.all(
width: 1.5,
color: index ==
manager
.getCurrentIndex
? Colors.blueAccent
: Colors.transparent)),
child: index + 1 <=
manager.notePictures.length
? Image.memory(
File.fromUri(manager
.notePictures[
index]
.polygon
.isNotEmpty
? manager
.notePictures[
index]
.documentPreviewImageFileUri
: manager
.notePictures[
index]
.originalPreviewImageFileUri)
.readAsBytesSync(),
gaplessPlayback: true,
)
: null),
),
));
})
.values
.toList()),
)),
Spacer(),
Container(
decoration: BoxDecoration(
color: Colors.white,
border: Border(top: BorderSide(color: Colors.black12))),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
FlatButton(
onPressed: () async => await widget.bloc
.cropNotePicture(reorderableManager.notePictures,
_pageController.page.round())
.then((notePictures) {
reorderableManager.updateNotePictures(notePictures);
reorderableManager
.getSmallImagesWidth(notePictures, context)
.then((imagesWidth) {
smallImagesWidth = imagesWidth;
});
}),
child: Column(
children: <Widget>[
Icon(
Icons.crop,
color: Colors.blueAccent,
),
Container(
margin: EdgeInsets.only(top: 1),
child: Text(
'裁切',
style: TextStyle(color: Colors.blueAccent),
),
)
],
),
),
FlatButton(
onPressed: () {
int deleteIndex = _pageController.page.round();
widget.bloc
.deletePicture(
reorderableManager.notePictures, deleteIndex)
.then((notePictures) {
if (deleteIndex == notePictures.length) {
reorderableManager
.updateCurrentIndex(notePictures.length - 1);
}
reorderableManager.updateNotePictures(notePictures);
reorderableManager
.getSmallImagesWidth(notePictures, context)
.then((imagesWidth) {
smallImagesWidth = imagesWidth;
});
if (reorderableManager.notePictures.length == 0) {
Navigator.pop(context);
}
});
},
child: Column(
children: <Widget>[
Icon(
Icons.delete_outline,
color: Colors.blueAccent,
),
Container(
margin: EdgeInsets.only(top: 1),
child: Text(
'刪除',
style: TextStyle(color: Colors.blueAccent),
),
),
],
),
)
],
),
)
],
)),
);
}
}
最佳答案
您无法阻止 ReorderableListView 上的重建。小部件,因为每次提供程序有更新时都会重建它。您可以在这里做的是跟踪所有可见 ListView 项目的当前索引。当应该显示来自 Provider 的新数据时,您可以保留以前 ListView 项的当前索引,并将新添加的项添加到列表末尾或您喜欢的任何位置。
关于android - flutter : How to prevent rebuild of whole Reorderable Listview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59926218/
我们在Eclipse中有几个使用CDT(CodeSourcery++)的C项目。 有两个项目可构建库,以供构建最终应用程序的“主”项目中使用。 现在我们发现重建其中一个库不会导致主项目也被重建。显然,
一些背景: 我正在为一个包含 Android 应用程序的大型项目使用 MSBuild 开发持续集成管道。该应用程序包括一些需要定期集成到项目中的自动生成的文件。这通常是通过手动复制它们并在 andro
众所周知,二进制文件取决于obj,而obj取决于.c文件(假定为C项目)。假设我有一个env.mk文件。该文件具有“export NO_DISPLAY = YES”之类的标志。在主Makefile中,
https://www.jetbrains.com/help/idea/compilation-types.html?search=rebuild 根据复杂类型的描述,重建项目会重新编译所有源文件,并
我在 xp 中运行 vs08,试图测试我已经研究了一段时间的 c++ 解决方案。 该解决方案由多个项目组成,我正在处理的两个项目分别包含服务器和客户端。我构建了服务器和客户端项目的调试实例来测试它们之
我成功安装了 MINGW32 和 CMake,并重建了 OpenCV 2.3.2( super 包)。但是 V2.4.2 不是 superpak 并且不具有 V2.3.1 具有的所有文件。我尝试重建的
这可能看起来很愚蠢,但我删除了其中一个节点上数据目录 (/var/lib/scylla/data/*) 中的所有内容。现在,为了恢复数据,我可以运行 nodetool repair 或 nodetoo
当我滚动到 ListView 的底部时,底部的项将被重建。当我滚动到顶部时,我的第一个项目被重建。第一项是带有可选筹码的卡,这种筹码在发生这种情况时会被取消选择。并且“入口”动画也会重播。我该如何阻止
我知道 docker 有一个 --no-cache=true 选项来强制干净地构建 docker 镜像。然而,对我来说,我真正想做的就是强制最后一步在我的 dockerfile 中运行,这是一个运行
这几天在做SQL调优,在测试的时候发现了一个奇怪的sql: SELECT StatMan([SC0],[SC1], [SB0000]) FROM (SELECT TOP 100 PERCENT [SC
为什么重建失败但没有错误? 从今天早上开始,这个错误不断出现。我构建了整个解决方案(25 个 C# 管理的项目)并出现“全部重建失败”,但没有任何错误! (我有 13 个关于 COM 不支持泛型的警告
我正在使用 Gitlab CI 来存储和部署 docker 镜像,但我遇到了一个大问题。 Gitlab CI 会在每次提交时重建所有图像。 第一步是构建我的常用镜像,大约需要 8 分钟。目前我只修改子
我有一个使用库(DPK/视觉控件)的程序。该库是在 Debug模式下编译的。这意味着优化是关闭的,范围检查是打开的,等等。库设置为“根据需要重建”。我不打算重新分发它(仅供内部使用)。 如果我在“发布
我正在测试 Electron 和串口模块的使用…… 当我运行 electron .命令,出现此错误: The module '…/teste3/node_modules/@serialport/bin
我需要将新生成的 apk 复制到远程机器上,所以目前我在桌面上有一个图标,它会触发 Python 脚本。 我希望这个脚本在重建项目成功后被 Android Studio 自动调用。 我怎样才能做到这一
所以我建立了我的第一个应用程序。这是一个天气应用程序。到目前为止,一切都按预期进行。但是有一个问题,每当我关闭应用程序然后重新打开它时,所有内容都为空(天气预报,位置名称,最高和最低温度)。当我按下刷
我收到命令 drush cache-rebuild 的[错误]找不到驱动程序 以下是 Drush 和 Drupal 版本详细信息,感谢任何帮助。谢谢 最佳答案 我将 wampp 与 PostgreSQ
我刚刚发现(困难的方式),如果您在从 Visual Studio 执行“重建”或“清理 -> 构建”后将应用程序部署到设备,您的应用程序将首先被卸载,然后重新安装,从而导致隔离存储文件被删除。 应用程
如何构建库(静态库或 dll/so),使其对系统的 C 运行时库的 future 更新不敏感? 7月底,微软updated一堆库,包括 C 运行时库。我们的应用程序是使用 MFC/C++/VB 和一些
在我的项目中,我有 2 个模块:app 和 library。当我在 Android Studio 3.0.1 中运行 Rebuild 时,会运行 3 个 gradle 任务: 干净 :library:
我是一名优秀的程序员,十分优秀!