Flutter 颤振图像生成器回调问题
我在使用图像错误生成器时遇到问题。例如,我想将树中的另一个小部件更改为没有颜色。我曾想过使用布尔标志,但它看起来很混乱。有没有一个简单的方法可以做到这一点。下面是我的意思的一个例子Flutter 颤振图像生成器回调问题,flutter,dart,Flutter,Dart,我在使用图像错误生成器时遇到问题。例如,我想将树中的另一个小部件更改为没有颜色。我曾想过使用布尔标志,但它看起来很混乱。有没有一个简单的方法可以做到这一点。下面是我的意思的一个例子 return Stack( children: [ Image.file( File("Some path"), errorBuilder: (BuildContext context, Object exception, StackTrace stackTra
return Stack(
children: [
Image.file(
File("Some path"),
errorBuilder: (BuildContext context, Object exception, StackTrace stackTrace) {
// If error builder draws i want the container below colour to become transparent...
// how do i do this?
return Text('Error');
},
),
Container(
height: 100,
width: 200,
color: Colors.red,
),
],
);
您可以复制粘贴运行下面的完整代码
您可以使用
StreamBuilder
并调用\u events.add(Colors.transparent)代码>在errorBuilder
在工作演示中,我使用image.network
模拟您的案例,您可以直接修改到image.file
代码片段
Image.file(
File(widget.path),
errorBuilder:
(BuildContext context, Object exception, StackTrace stackTrace) {
_events.add(Colors.transparent);
return Text('Error');
},
),
StreamBuilder<Color>(
stream: _events.stream,
builder: (BuildContext context, AsyncSnapshot<Color> snapshot) {
return Container(
height: 100,
width: 200,
color: snapshot.data,
);
})
Image.file(
文件(widget.path),
错误生成器:
(BuildContext上下文、对象异常、StackTrace StackTrace){
_添加(颜色.透明);
返回文本('Error');
},
),
StreamBuilder(
流:_events.stream,
生成器:(BuildContext上下文,异步快照){
返回容器(
身高:100,
宽度:200,
颜色:snapshot.data,
);
})
工作演示
完整代码
import 'package:flutter/material.dart';
import 'dart:async';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ImageHandelError(
path: 'https://picsum.photos/250?image=9',
),
ImageHandelError(
path: 'not exist',
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
class ImageHandelError extends StatefulWidget {
String path;
ImageHandelError({this.path});
@override
_ImageHandelErrorState createState() => _ImageHandelErrorState();
}
class _ImageHandelErrorState extends State<ImageHandelError> {
StreamController<Color> _events;
@override
initState() {
super.initState();
_events = StreamController<Color>();
_events.add(Colors.red);
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
Image.network(
widget.path,
errorBuilder:
(BuildContext context, Object exception, StackTrace stackTrace) {
_events.add(Colors.transparent);
return Text('Error');
},
),
StreamBuilder<Color>(
stream: _events.stream,
builder: (BuildContext context, AsyncSnapshot<Color> snapshot) {
return Container(
height: 100,
width: 200,
color: snapshot.data,
);
})
],
);
}
}
导入“包装:颤振/材料.省道”;
导入“dart:async”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
int _计数器=0;
void _incrementCounter(){
设置状态(){
_计数器++;
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
图像处理器(
路径:'https://picsum.photos/250?image=9',
),
图像处理器(
路径:“不存在”,
),
],
),
),
浮动操作按钮:浮动操作按钮(
按下时:\ u递增计数器,
工具提示:“增量”,
子:图标(Icons.add),
),
);
}
}
类ImageHandlerRor扩展StatefulWidget{
字符串路径;
ImageHandlerRor({this.path});
@凌驾
_ImageHandlerRorState createState()=>\u ImageHandlerRorState();
}
类_ImageHandlerRorState扩展状态{
StreamController_事件;
@凌驾
initState(){
super.initState();
_事件=StreamController();
_事件。添加(颜色。红色);
}
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
图像网络(
widget.path,
错误生成器:
(BuildContext上下文、对象异常、StackTrace StackTrace){
_添加(颜色.透明);
返回文本('Error');
},
),
StreamBuilder(
流:_events.stream,
生成器:(BuildContext上下文,异步快照){
返回容器(
身高:100,
宽度:200,
颜色:snapshot.data,
);
})
],
);
}
}
检查AnimatedBuilder
或ValueListenableBuilder
或类似内容我仍然需要使用布尔字段来跟踪错误您可以直接更改代码。因为我必须让代码毫无问题地运行。所以我用image.network来模拟你的情况。好吧,对不起,当我读你的答案时,我半睡半醒。我知道你对这条小溪做了什么。我稍后会尝试:)嗨@chunhunghan你的答案似乎很有效:)谢谢你的帮助。这导致了我在图像错误生成器中的另一个错误,我认为这可能是一个关于flutter的错误(尽管我可能是错的),如果您能抽出几分钟来看看,我将不胜感激