Flutter 布局生成器中的FutureBuilder多次调用future
我在尝试Flutter 布局生成器中的FutureBuilder多次调用future,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我在尝试LayoutBuilder和FutureBuilder时遇到了一个情况。如果我把FutureBuilder放在一个小部件中而不是LayoutBuilder中,一切都很好,未来只解决一次。但是,当我将FutureBuilder放入LayoutBuilder中时,未来将无限地解决,最终的小部件永远不会绘制出来 class MyApp extends StatelessWidget { @override Widget build(BuildContext context) {
LayoutBuilder
和FutureBuilder
时遇到了一个情况。如果我把FutureBuilder
放在一个小部件中而不是LayoutBuilder
中,一切都很好,未来只解决一次。但是,当我将FutureBuilder
放入LayoutBuilder
中时,未来将无限地解决,最终的小部件永远不会绘制出来
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Photo View example',
theme: theme,
home: new Scaffold(
body: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return ImagePainter();
}
),
),
);
}
}
class ImagePainter extends StatelessWidget{
Future<ui.Image> loadImage() async {
ByteData data = await rootBundle.load("graphics/test.jpg");
if (data == null) {
print("data is null");
} else {
var codec = await ui.instantiateImageCodec(data.buffer.asUint8List());
var frame = await codec.getNextFrame();
return frame.image;
}
}
@override
Widget build(BuildContext context) {
return Container(
child: FutureBuilder(
future: loadImage(),
builder: (BuildContext context, AsyncSnapshot<ui.Image> snapshot) {
switch(snapshot.connectionState) {
case ConnectionState.waiting :
return Center(child: Text("loading..."),);
default:
if (snapshot.hasError) {
return Center(child: Text("error: ${snapshot.error}"),);
} else {
print("data: ${snapshot.data}");
return Placeholder(); //just for testing
}
}
},
),
);
}
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“照片视图示例”,
主题:主题,,
家:新脚手架(
正文:布局生成器(
生成器:(BuildContext上下文,BoxConstraints){
返回ImagePainter();
}
),
),
);
}
}
类ImagePainter扩展了无状态小部件{
Future loadImage()异步{
ByteData=wait rootBundle.load(“graphics/test.jpg”);
如果(数据==null){
打印(“数据为空”);
}否则{
var codec=wait ui.instantialeimagecodec(data.buffer.asUint8List());
var frame=await codec.getNextFrame();
返回帧。图像;
}
}
@凌驾
小部件构建(构建上下文){
返回容器(
孩子:未来建设者(
future:loadImage(),
生成器:(BuildContext上下文,异步快照){
交换机(快照.连接状态){
案例连接状态。正在等待:
返回中心(子项:文本(“加载…”),);
违约:
if(snapshot.hasError){
返回中心(子项:文本(“错误:${snapshot.error}”);
}否则{
打印(“数据:${snapshot.data}”);
返回占位符();//仅用于测试
}
}
},
),
);
}
}
所以可以解释一下,或者我做错了什么。类ImagePainter扩展了这个小部件{
class ImagePainter extends StatelessWidget{
Future<ui.Image> loadImage() async {
ByteData data = await rootBundle.load("graphics/test.jpg");
if (data == null) {
print("data is null");
} else {
var codec = await ui.instantiateImageCodec(data.buffer.asUint8List());
var frame = await codec.getNextFrame();
return frame.image;
}
}
@override
Widget build(BuildContext context) {
return Container(
child: FutureBuilder(
future: loadImage(),
builder: (BuildContext context, AsyncSnapshot<ui.Image> snapshot) {
switch(snapshot.connectionState) {
case ConnectionState.waiting :
print("data: ${snapshot.data}");
//return Center(child: Text("loading..."),);
default:
if (snapshot.hasError) {
return Center(child: Text("error: ${snapshot.error}"),);
} /*else {
print("data: ${snapshot.data}");
return Placeholder(); //just for testing
}*/
}
},
),
);
}
}
Future loadImage()异步{
ByteData=wait rootBundle.load(“graphics/test.jpg”);
如果(数据==null){
打印(“数据为空”);
}否则{
var codec=wait ui.instantialeimagecodec(data.buffer.asUint8List());
var frame=await codec.getNextFrame();
返回帧。图像;
}
}
@凌驾
小部件构建(构建上下文){
返回容器(
孩子:未来建设者(
future:loadImage(),
生成器:(BuildContext上下文,异步快照){
交换机(快照.连接状态){
案例连接状态。正在等待:
打印(“数据:${snapshot.data}”);
//返回中心(子项:文本(“加载…”),);
违约:
if(snapshot.hasError){
返回中心(子项:文本(“错误:${snapshot.error}”);
}/*其他{
打印(“数据:${snapshot.data}”);
返回占位符();//仅用于测试
}*/
}
},
),
);
}
}
你说“小部件从不绘制”是什么意思?是否绘制了错误小部件?我认为您更改了FutureBuilder
中的小部件树,这将导致LayoutBuilder
的重建。因此,这一过程非常困难looped@KirillShashov这也是我的想法,但从我在代码中看到的情况来看似乎不是这样。不,正如您在代码示例中看到的,图像绘制器返回时没有对小部件树进行任何更改。它一直在循环中。@NatwarSingh你能解决它吗?我面临着类似的问题。问题是当你将Future builder放入布局生成器时。