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使屏幕侦听逻辑来重建