Flutter架构管理插件flutter_arch的使用
Flutter架构管理插件flutter_arch的使用
flutter_arch
flutter_arch
是一个用于帮助开发者更好地管理Flutter应用架构的插件。它包括ViewModel、LiveData及BaseViewState等组件,主要用于将业务逻辑和UI分离。
arch
ViewModel
ViewModel
用于处理业务逻辑,并为 BaseViewState
提供可观测的数据 LiveData
。
使用示例:
class HomeModel extends ViewModel {
/// 可观测的数据
LiveData<int> count = LiveData(0);
HomeModel(BuildContext context) : super(context);
@override
void initData() {
// 完成初始化数据工作
count.setValue(1);
}
/// 提供给UI操作的数据的
void incrementCounter() {
var countValue = count.getValue() + 1;
Future.delayed(
const Duration(seconds: 3), () => count.setValue(countValue));
}
/// 释放资源
@override
void dispose() {}
}
BaseViewState
BaseViewState
是一个用于 State
的mixin类,为UI状态提供 ViewModel
。
使用示例:
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage>
with BaseViewState<MyHomePage, HomeModel> {
int _counter = 0;
@override
void initState() {
super.initState();
// initState阶段使用getValue直接,从LiveData中获取数据
_counter = model.count.getValue();
// 观察LiveData中数据变化,第二lifecycleOwner会将观察者与State的生命周期绑定,当state 执行dispose后,观察者会自动取消注册。
model.count.listen((t) {
// 根据需要去更新UI
setState(() {
_counter = t;
});
}, lifecycleOwner: this);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
IconButton(
iconSize: 100,
color: Colors.amber,
onPressed: () =>
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => const MyHomePage(title: "第二个"))),
icon: const Icon(Icons.nat)),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
// 通过model 操作数据。
onPressed: () => model.incrementCounter(),
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
/// 实现该方法 会在initState阶段执行 创建Model
@override
HomeModel createModel() => HomeModel(context);
}
LiveData
LiveData
是一个数据持有类,可以通过 listen
方法观测数据的变化。listen
的第一个参数为数据变化的回调,可选参数 lifecycleOwner
类型为 BaseViewState
,指定 lifecycleOwner
时,数据变化的回调会在 BaseViewState
dispose时自动取消注册。如果 LiveData
不指定 lifecycleOwner
,则需要手动移除数据变化的回调。
使用示例:
class UserInfo {
String name;
UserInfo(this.name, this.account);
String account;
}
LiveData<UserInfo> userInfo = LiveData(UserInfo("jack", "123"));
void setUserInfo(UserInfo info) {
// 更新数据
userInfo.setValue(info);
}
void observer(UserInfo info) {
if (kDebugMode) {
print("name=${info.name} & account= ${info.account}");
}
}
void listenUserInfo() {
// 直接获取
userInfo.getValue();
// 监听变化 lifecycleOwner 类型
userInfo.listen(observer, lifecycleOwner: null);
}
void removeObserver() {
// 手动移除
userInfo.removeObserver(observer);
}
更多关于Flutter架构管理插件flutter_arch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter架构管理插件flutter_arch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter开发中,flutter_arch
是一个用于管理应用架构的插件,它可以帮助开发者更好地组织代码,实现关注点分离(Separation of Concerns, SoC)。虽然 flutter_arch
并不是一个官方广泛认知的插件(可能指的是某种特定的架构管理库或自定义库),但基于你的要求,我将展示一个使用 Flutter 中常见的架构模式(如 MVVM 或 Clean Architecture)的代码示例,这些模式可以通过一些常见的库和自定义代码来实现。
以下是一个使用 Flutter 和 Provider(一个流行的状态管理库)来模拟类似 flutter_arch
功能的简单示例,实现一个基本的数据流管理。
1. 创建 Flutter 项目
首先,确保你已经安装了 Flutter 并创建了一个新的 Flutter 项目:
flutter create my_flutter_arch_app
cd my_flutter_arch_app
2. 添加 Provider 依赖
在 pubspec.yaml
文件中添加 provider
依赖:
dependencies:
flutter:
sdk: flutter
provider: ^6.0.0 # 确保使用最新版本
然后运行 flutter pub get
来获取依赖。
3. 创建 Model
在 lib
目录下创建一个 models
文件夹,并在其中创建一个 user_model.dart
文件:
// lib/models/user_model.dart
class User {
final String name;
final int age;
User({required this.name, required this.age});
}
4. 创建 Repository
在 lib
目录下创建一个 repositories
文件夹,并在其中创建一个 user_repository.dart
文件:
// lib/repositories/user_repository.dart
import 'package:my_flutter_arch_app/models/user_model.dart';
class UserRepository {
// 模拟获取用户数据
Future<User> fetchUser() async {
return Future.delayed(Duration(seconds: 1), () => User(name: 'Alice', age: 30));
}
}
5. 创建 ViewModel
在 lib
目录下创建一个 viewmodels
文件夹,并在其中创建一个 user_viewmodel.dart
文件:
// lib/viewmodels/user_viewmodel.dart
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:my_flutter_arch_app/models/user_model.dart';
import 'package:my_flutter_arch_app/repositories/user_repository.dart';
final userViewModelProvider = StateNotifierProvider<UserViewModel, User?>((ref) {
final repository = UserRepository();
return UserViewModel(repository);
});
class UserViewModel extends StateNotifier<User?> {
final UserRepository repository;
UserViewModel(this.repository) : super(null) {
fetchUser();
}
void fetchUser() async {
state = await repository.fetchUser();
}
}
注意:这里使用了 flutter_riverpod
作为状态管理库,它是 Provider 的一个更现代、更强大的版本。如果你更倾向于使用 provider
,可以相应地调整代码。
6. 创建 UI 组件
在 lib
目录下的 main.dart
文件中创建 UI 组件:
// lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:my_flutter_arch_app/viewmodels/user_viewmodel.dart';
void main() {
runApp(
ProviderScope(
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: UserScreen(),
);
}
}
class UserScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final user = ref.watch(userViewModelProvider);
return Scaffold(
appBar: AppBar(
title: Text('User Info'),
),
body: Center(
child: user == null
? CircularProgressIndicator()
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Name: ${user!.name}'),
Text('Age: ${user!.age}'),
],
),
),
);
}
}
7. 运行应用
确保一切设置正确后,运行应用:
flutter run
这个示例展示了如何使用 Provider(或 Riverpod)和自定义的 ViewModel 来管理 Flutter 应用中的状态和数据流,从而实现了类似 flutter_arch
插件的功能。当然,根据项目的复杂性和需求,你可能需要更复杂的架构和更多的库来实现完整的功能。