当我从图库或照相机(image_picker和image_cropper)中选择图像并想要执行进一步操作时,我使用这两个库进行裁剪和裁剪(build
方法)被自动调用并更改我的代码流程。
在android设备中,此代码可以正常工作,build
方法仅被调用一次,但是在iOS设备中,build
在我从图库中选择图像并裁剪后会被调用。
在iOS设备中,打开设备的照片库后,将调用build
方法,而在调用crop时,将再次调用Drawer类的build
方法。
仅在Drawer中发生此问题,如果我将TextRobo类称为Navigator.of(context).pushReplacementNamed('/textRobo');
,则此工作正常。
抽屉类
_getDrawerItemWidget(int pos, String title) {
switch (pos) {
case 0:
if(title.contains("From Gallery"))
return new TextRobo();
if(title.contains("From Camera"))
return new TextRoboCamera();
else if(widget.fragment_class.contains("Translate"))
return new TranslateLangue(widget.textToTranslate);
else
return new TranslateLangue("");
break;
case 1:
if(title.contains("From Gallery"))
return new BarCodeRobo();
else
return new BarCodeQuick();
break;
case 2:
return new TranslateLangue("");
//default:
//return new TranslateLangue("");
}
}
@override
Widget build(BuildContext context) {
print('Building widget');
return new Scaffold(
appBar: new AppBar(
iconTheme: new IconThemeData(color: Colors.white),
title: new Text("RoboScan",
style: new TextStyle(color: Colors.white),),
),
drawer: new Drawer(
child: new ListView(
children: <Widget>[
new Container( height: 140.0, color: Colors.orange,
child: new Center(child:
new Text('RoboScan', style: new TextStyle(color: Colors.white,
fontSize:25.0, fontWeight: FontWeight.bold),
),
),
),
new Column(
children: drawerOptions)
],
),
),
body: _getDrawerItemWidget(_selectedDrawerIndex, widget.fragment_class ),
);
}
图像选择器和裁剪类(TextRobo)
File _imageFile;
List<VisionText> _currentTextLabels = <VisionText>[];
FirebaseVisionTextDetector textDetector =
FirebaseVisionTextDetector.instance;
@override
void initState() {
// TODO: implement initState
//scanImage();
super.initState();
_getAndScanImage();
}
Future<void> _getAndScanImage() async {
setState(() {
_imageFile = null;
// _imageSize = null;
});
final File imageFile =
await ImagePicker.pickImage(source: ImageSource.gallery);
_cropImage(imageFile);
}
答案 0 :(得分:0)
窗口小部件的build
方法应该被频繁调用。我建议您重新组织事物,以允许按Flutter框架的要求调用构建方法。
注意:最好将“状态”推到树的尽头(朝向叶子小部件),以最大程度地减少由于状态变化而导致的小部件重建的影响。
在您的情况下,您可能需要考虑从_getAndScanImage()
方法中删除initState
。让渲染流程影响您的交互不是一个好习惯。
您能尝试通过按下按钮来触发_getAndScanImage()
方法吗?还是通过其他一些用户触发操作来触发initState
中的呈现生命周期?