Flutter 什么';颤振的最优编码方法
我是一个更新的颤振代码,它的小部件树对我来说是陌生的,现在我想编码作为一个最佳的方式,像分开一个逻辑和小部件,所以我这样做,但我不知道它的权利和一个共同的或有一个最好的 我已创建文件夹Flutter 什么';颤振的最优编码方法,flutter,Flutter,我是一个更新的颤振代码,它的小部件树对我来说是陌生的,现在我想编码作为一个最佳的方式,像分开一个逻辑和小部件,所以我这样做,但我不知道它的权利和一个共同的或有一个最好的 我已创建文件夹screens/[已创建所有屏幕] 为每个屏幕文件夹创建嵌套文件夹,如screens/upload/[所有文件都属于此屏幕] 在里面我创建了3个文件 screens/upload/upload\u screen.dart screens/upload/upload\u widgets.dart screens/up
screens/[已创建所有屏幕]
为每个屏幕文件夹创建嵌套文件夹,如screens/upload/[所有文件都属于此屏幕]
在里面我创建了3个文件
screens/upload/upload\u screen.dart
screens/upload/upload\u widgets.dart
screens/upload/upload\u logic.dart
上传屏幕
class UploadScreen extends StatefulWidget {
@override
_UploadScreenState createState() => _UploadScreenState();
}
class _UploadScreenState extends State<UploadScreen> {
UploadWidgets uploadWidgets;
@override
Widget build(BuildContext context) {
uploadWidgets = UploadWidgets(context);
return ChangeNotifierProvider.value(
value: UploadLogic(context),
child: Consumer<UploadLogic>(
builder: (context, logic, _){
print(logic.chosenFile);
return Scaffold(
body: logic.chosenFile == null ? uploadWidgets.buildInitContent() : Text('hello')
);
}
),
);
}
}
class UploadScreen扩展了StatefulWidget{
@凌驾
_UploadScreenState createState()=>_UploadScreenState();
}
类_UploadScreenState扩展状态{
UploadWidgets UploadWidgets;
@凌驾
小部件构建(构建上下文){
uploadWidgets=uploadWidgets(上下文);
返回ChangeNotifierProvider.value(
值:UploadLogic(上下文),
儿童:消费者(
构建器:(上下文、逻辑){
打印(logic.chosenFile);
返回脚手架(
body:logic.chosenFile==null?uploadWidgets.buildInitContent():Text('hello')
);
}
),
);
}
}
上传逻辑
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
class UploadLogic with ChangeNotifier {
BuildContext context;
File chosenFile;
UploadLogic(this.context);
Future<void> pickupImageFromCameraApp() async {
final File imageFile = await ImagePicker.pickImage(
source: ImageSource.camera,
imageQuality: 95,
maxWidth: 600,
);
chosenFile = imageFile;
notifyListeners();
}
}
导入'dart:io';
进口“包装:颤振/材料.省道”;
导入“包:image_picker/image_picker.dart”;
带有ChangeNotifier的类UploadLogic{
构建语境;
文件选择文件;
UploadLogic(this.context);
未来pickupImageFromCameraApp()异步{
最终文件imageFile=wait ImagePicker.pickImage(
来源:ImageSource.camera,
图像质量:95,
最大宽度:600,
);
chosenFile=imageFile;
notifyListeners();
}
}
上传小部件
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import './upload_logic.dart';
class UploadWidgets {
BuildContext context;
UploadLogic uploadLogic;
UploadWidgets(this.context) {
uploadLogic = UploadLogic(context);
}
void showChoodeBottomModal() {
showModalBottomSheet(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10), topRight: Radius.circular(10))),
context: context,
builder: (context) {
return Container(
height: 200,
child: ListView(
children: <Widget>[
ListTile(
title: Text('From Cameara'),
subtitle: Text('Take your photo from your camer app'),
leading: Icon(Icons.camera),
onTap: ()=>uploadLogic.pickupImageFromCameraApp(),
),
ListTile(
title: Text('From Gallary'),
subtitle: Text('choose your image from your gallary app'),
leading: Icon(Icons.photo_album),
onTap: () {},
),
ListTile(
title: Text('From Cameara'),
leading: Icon(Icons.exit_to_app),
onTap: () => Navigator.of(context).pop(),
),
],
),
);
});
}
Widget buildInitContent() {
return Container(
color: Theme.of(context).accentColor,
width: double.infinity,
padding: EdgeInsets.all(10),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SvgPicture.asset(
'assets/images/upload.svg',
height: 300,
),
SizedBox(
height: 20,
),
Text(
'Upload A new image',
style: TextStyle(fontSize: 30),
),
SizedBox(
height: 20,
),
RaisedButton.icon(
color: Theme.of(context).primaryColor,
icon: Icon(
Icons.file_upload,
color: Colors.white,
),
label: Text(
'Choose a file',
style: TextStyle(color: Colors.white),
),
onPressed: () => showChoodeBottomModal(),
)
],
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:flatter_svg/svg.dart”;
导入“./upload_logic.dart”;
类上载窗口小部件{
构建语境;
上传逻辑上传逻辑;
UploadWidgets(this.context){
uploadLogic=uploadLogic(上下文);
}
void showthootebottomodal(){
showModalBottomSheet(
形状:圆形矩形边框(
borderRadius:仅限borderRadius(
左上角:半径。圆形(10),右上角:半径。圆形(10)),
上下文:上下文,
生成器:(上下文){
返回容器(
身高:200,
子:ListView(
儿童:[
列表砖(
标题:文本(“来自Camera”),
字幕:文本(“从相机应用程序拍摄照片”),
前导:图标(图标、摄像头),
onTap:()=>uploadLogic.pickupImageFromCameraApp(),
),
列表砖(
标题:文本(“来自Gallary”),
字幕:文本(“从gallary应用程序中选择图像”),
领先:图标(图标、相册),
onTap:(){},
),
列表砖(
标题:文本(“来自Camera”),
前导:图标(图标。退出到应用程序),
onTap:()=>Navigator.of(context.pop(),
),
],
),
);
});
}
Widget buildInitContent(){
返回容器(
颜色:主题。背景。强调颜色,
宽度:double.infinity,
填充:边缘设置。全部(10),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
SvgPicture.asset(
“assets/images/upload.svg”,
身高:300,
),
大小盒子(
身高:20,
),
正文(
“上载新图像”,
样式:TextStyle(字体大小:30),
),
大小盒子(
身高:20,
),
RaisedButton.icon(
颜色:主题。背景。原色,
图标:图标(
Icons.file_上传,
颜色:颜色,白色,
),
标签:文本(
“选择一个文件”,
样式:TextStyle(颜色:Colors.white),
),
onPressed:()=>ShowChooteBottomModel(),
)
],
),
);
}
}
您的方法是正确的。我曾经创建过以下文件夹:
有些组件你会使用它一次,不要为一个小部件只使用一次而制作文件 是的,与许多其他编程语言一样,将代码分解为多个文件是一个更好的选择,因为您可以更好地控制所做的事情。
虽然业余爱好者的常见方法是将所有代码编写在几个文件中,然后在代码中丢失,但拥有多个文件更好、更专业。查看本文,了解颤振中的MVC方法:感谢分享您的建议,但如果这是一种好方法,那么提供者呢如果每个屏幕都有自己的逻辑提供者,我使用provider使屏幕侦听逻辑来重建