使用 BloC 在 Flutter 的屏幕内编写简单的函数
Write simple functions inside screens in Flutter using BloC
我一直在使用 BloC 模式开发 Flutter 应用程序。我有两个函数,我不知道是否应该将它们写在我的 BloC 文件中。这是代码。
这是我的 BloC 文件代码:
import 'dart:io';
import 'package:FlutterTWOHANDSAPPv2/Pets/model/createPetScreenProperties.dart';
import 'package:FlutterTWOHANDSAPPv2/bloc/jsonReader.dart';
import 'package:flutter/material.dart';
import 'package:generic_bloc_provider/generic_bloc_provider.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
class PetsBloc implements Bloc {
CreatePetScreenProperties properties;
PetsBloc() {
properties = CreatePetScreenProperties();
}
@override
void dispose() {
// TODO: implement dispose
}
getImage(ImageSource source) async {
ImagePicker picker = ImagePicker();
PickedFile image = await picker.getImage(source: source);
if (image != null) {
File cropped = await ImageCropper.cropImage(
sourcePath: image.path,
aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1),
compressQuality: 100,
maxWidth: 1000,
maxHeight: 1000,
compressFormat: ImageCompressFormat.jpg,
androidUiSettings: AndroidUiSettings(
toolbarColor: Colors.blueAccent,
toolbarTitle: JsonReader.getTranslationString("CREATEPET_CROP"),
statusBarColor: Colors.deepOrange.shade900,
backgroundColor: Colors.white,
));
} else {
// Do something
}
}
}
这是我的屏幕文件
import 'dart:io';
import 'package:FlutterTWOHANDSAPPv2/Pets/bloc/petsBloc.dart';
import 'package:flutter/material.dart';
import 'package:generic_bloc_provider/generic_bloc_provider.dart';
import 'package:image_picker/image_picker.dart';
class CreateNewPetScreen extends StatelessWidget {
PetsBloc bloc;
bool inProcessOfSelectingImage() => bloc.properties.inProcessOfSelectingImage;
File imageOfPet() => bloc.properties.image;
@override
Widget build(BuildContext context) {
bloc = BlocProvider.of(context);
return Container(
padding: EdgeInsets.all(20),
child: Stack(
children: [
Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Center(
child: GestureDetector(
onTap: selectPetPicture,
child: Container(
height: 150,
width: 150,
decoration: BoxDecoration(
image: DecorationImage(image: getImageOfPet()),
shape: BoxShape.circle,
color: Colors.black),
),
),
)
],
),
)
],
),
);
}
void selectPetPicture() {
bloc.getImage(ImageSource.gallery);
}
ImageProvider<Object> getImageOfPet() {
return imageOfPet() != null
? FileImage(imageOfPet())
: AssetImage("heregoesadefaultimageasset");
}
}
如您所见,在我的屏幕中,最底部有两个函数,它们执行一些非常基本的操作,所以我觉得它们不适合我的 BloC 文件。我应该把它们写在那里吗?我这样做会破坏架构吗?
不太清楚您在 PetsBloc class 中实际使用了任何特定于 bloc 模式的内容。据我所知,您可以删除该实现并像普通对象一样创建 PetsBloc
,并且功能不会改变。话虽这么说,假设你有一个完整的 Bloc class 设置和 mapEventToState
方法......适当的 Bloc 架构只会从你的 UI 触发事件,然后触发一个状态。
bloc.add(EventThatTriggersState);
但是 Cubits 非常适合更简单的任务,并且在 Cubit class.
中具有简单功能并不违背预期的体系结构
我一直在使用 BloC 模式开发 Flutter 应用程序。我有两个函数,我不知道是否应该将它们写在我的 BloC 文件中。这是代码。
这是我的 BloC 文件代码:
import 'dart:io';
import 'package:FlutterTWOHANDSAPPv2/Pets/model/createPetScreenProperties.dart';
import 'package:FlutterTWOHANDSAPPv2/bloc/jsonReader.dart';
import 'package:flutter/material.dart';
import 'package:generic_bloc_provider/generic_bloc_provider.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
class PetsBloc implements Bloc {
CreatePetScreenProperties properties;
PetsBloc() {
properties = CreatePetScreenProperties();
}
@override
void dispose() {
// TODO: implement dispose
}
getImage(ImageSource source) async {
ImagePicker picker = ImagePicker();
PickedFile image = await picker.getImage(source: source);
if (image != null) {
File cropped = await ImageCropper.cropImage(
sourcePath: image.path,
aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1),
compressQuality: 100,
maxWidth: 1000,
maxHeight: 1000,
compressFormat: ImageCompressFormat.jpg,
androidUiSettings: AndroidUiSettings(
toolbarColor: Colors.blueAccent,
toolbarTitle: JsonReader.getTranslationString("CREATEPET_CROP"),
statusBarColor: Colors.deepOrange.shade900,
backgroundColor: Colors.white,
));
} else {
// Do something
}
}
}
这是我的屏幕文件
import 'dart:io';
import 'package:FlutterTWOHANDSAPPv2/Pets/bloc/petsBloc.dart';
import 'package:flutter/material.dart';
import 'package:generic_bloc_provider/generic_bloc_provider.dart';
import 'package:image_picker/image_picker.dart';
class CreateNewPetScreen extends StatelessWidget {
PetsBloc bloc;
bool inProcessOfSelectingImage() => bloc.properties.inProcessOfSelectingImage;
File imageOfPet() => bloc.properties.image;
@override
Widget build(BuildContext context) {
bloc = BlocProvider.of(context);
return Container(
padding: EdgeInsets.all(20),
child: Stack(
children: [
Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Center(
child: GestureDetector(
onTap: selectPetPicture,
child: Container(
height: 150,
width: 150,
decoration: BoxDecoration(
image: DecorationImage(image: getImageOfPet()),
shape: BoxShape.circle,
color: Colors.black),
),
),
)
],
),
)
],
),
);
}
void selectPetPicture() {
bloc.getImage(ImageSource.gallery);
}
ImageProvider<Object> getImageOfPet() {
return imageOfPet() != null
? FileImage(imageOfPet())
: AssetImage("heregoesadefaultimageasset");
}
}
如您所见,在我的屏幕中,最底部有两个函数,它们执行一些非常基本的操作,所以我觉得它们不适合我的 BloC 文件。我应该把它们写在那里吗?我这样做会破坏架构吗?
不太清楚您在 PetsBloc class 中实际使用了任何特定于 bloc 模式的内容。据我所知,您可以删除该实现并像普通对象一样创建 PetsBloc
,并且功能不会改变。话虽这么说,假设你有一个完整的 Bloc class 设置和 mapEventToState
方法......适当的 Bloc 架构只会从你的 UI 触发事件,然后触发一个状态。
bloc.add(EventThatTriggersState);
但是 Cubits 非常适合更简单的任务,并且在 Cubit class.
中具有简单功能并不违背预期的体系结构