几周以来,我一直在Flutter中编写应用程序,然后开始思考几天前最好的架构是什么。
首先介绍一下上下文:
我一直在经历不同的架构方法,并设法使一项工作似乎最终适合我。
由于我将具有多个功能,可在应用程序的不同位置重用,因此我想按功能(或模块)划分代码,然后可以在不同的屏幕中独立使用这些功能。 文件夹架构如下:
FlutterApp
|
|--> ios/
|--> android/
|--> lib/
|
|--> main.dart
|--> screens/
| |
| |--> logged/
| | |
| | |--> profile.dart
| | |--> settings.dart
| | |--> ...
| |
| |--> notLogged/
| | |
| | |--> home.dart
| | |--> loading.dart
| | |--> ...
|
|--> features/
|
|--> featureA/
| |
| |--> ui/
| | |--> simpleUI.dart
| | |--> complexUI.dart
| |--> provider/
| | |-->featureAProvider.dart
| |--> models/
| |--> featureAModel1.dart
| |--> featureAModel2.dart
| |--> ...
|
|
|--> featureB/
| |
| |--> ui/
| | |--> simpleUI.dart
| | |--> complexUI.dart
| |--> provider/
| | |--> featureBProvider.dart
| |--> models/
| |--> featureBModel1.dart
| |--> featureBModel2.dart
| |--> ...
|
...
理想情况下,每个功能都应遵循以下准则:
我已经尝试过将这种方法与我的应用程序的一项功能(或两项功能取决于您的看法)一起使用,该功能可以记录/收听语音记录。 我发现它很有趣,因为您可以在一个地方录制,但可以在许多地方听录音:例如在录制之后,或者在向您发送录音时。
这是我想出的:
models/
文件夹,因为它只是我在其他地方处理的文件 在代码中,它有点冗长,但可以按预期工作,例如,在屏幕上,我可以请求voiceRecorder功能,如下所示:
class Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => VoiceRecorderNotifier(),
child: Column(
children: [
AnUIWidget(),
AnotherUIWidget(),
...,
// The "dumb" feature UI widget from 'features/voiceRecorder/ui/simpleButton.dart' that can be overrided if you follow use the VoiceRecorderNotifier
VoiceRecorderButtonSimple(),
...,
]
)
);
}
}
我也可以同时使用两个功能(voiceRecorder / voicePlayer),就像这样:
class Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => VoiceRecorderNotifier(),
child: Column(
children: [
AnUIWidget(),
AnotherUIWidget(),
...,
VoiceRecorderButtonSimple(),
...,
// adding the dependent voicePlayer feature (using the VoiceRecorderNotifier data);
Consumer<VoiceRecorderNotifier>(
builder: (_, _voiceRecorderNotifier, __) {
if (_voiceRecorderNotifier.audioFile != null) {
// We do have audio file, so we put the VoicePlayer feature
return ChangeNotifierProvider<VoicePlayerNotifier>(
create: (_) => VoicePlayerNotifier.withFile(_voiceRecorderNotifier.audioFile),
child: VoicePlayerButtonSimple(),
);
} else {
// We don't have audio file, so no voicePlayer needed
return AnotherUIWidget();
}
}
),
...,
AnotherUIWidget(),
]
)
);
}
}
这是一个全新的测试,所以我认为有些缺点现在还看不到,但是我觉得其中的优点很少:
Text('hi')
但是我仍然可以“覆盖” UI以显示特定功能;
我看到的缺点:
最后是以下问题: