Flutter核心功能扩展插件mustang_core的使用
Flutter核心功能扩展插件mustang_core的使用
Mustang 是一个用于构建Flutter应用程序的框架,提供了许多开箱即用的功能,如状态管理、持久化、缓存、事件管理和切面编程等。本文将详细介绍如何使用 mustang_core 插件,并提供完整的示例代码。
目录
框架组件
Mustang框架由以下几个主要组件构成:
- Model:定义视图所需的数据。
- Screen:Flutter小部件,可以嵌入到其他屏幕上。
- State:允许访问与关联屏幕指定的模型。
- Service:定义与关联屏幕相关的数据获取操作和业务逻辑。
组件通信
每个 Screen
都与一个 Service
和一个 State
关联。以下是 Screen
的生命周期步骤:
Screen
在构建UI时读取State
。Screen
响应用户事件(如滚动、点击等)调用Service
中的方法。Service
:- 读取/更新
Models
,并由MustangStore
管理。 - 根据需要进行API调用。
- 当
Models
被修改时通知State
。
- 读取/更新
State
通知Screen
重新构建UI。- 返回步骤1。
模型
模型是一个抽象类,标注为 @appModel
,名称以 $
开头。字段通过 InitField
注解初始化。
@appModel
abstract class $User {
late String name;
late int age;
@InitField(false)
late bool admin;
@WireNameField('postalCode')
late int zip;
@InitField(['user', 'default'])
late BuiltList<String> roles;
late $Address address;
late BuiltList<$Vehicle> vehicles;
@InitField('')
@SerializeField(false)
late String errorMsg;
}
状态
状态是一个抽象类,标注为 @screenState
,名称以 $
开头,仅允许模型作为字段。
@screenState
abstract class $ExampleScreenState {
late $User user;
late $Vehicle vehicle;
}
服务
服务是一个抽象类,标注为 @screenService
,名称以 $
开头。服务具有以下API:
updateState
:更新模型并触发屏幕重建。memoizeScreen
:调用方法仅执行一次。clearMemoizedScreen
:清除缓存的数据。
@screenService
abstract class $ExampleScreenService {
void getUser() {
User user = MustangStore.get<User>() ?? User();
updateState1(user);
}
}
屏幕
每个 Screen
应该是 MustangScreen
小部件的顶级小部件。
Widget build(BuildContext context) {
return MustangScreen<CounterState>(
state: CounterState(context: context),
builder: (BuildContext context, CounterState state) {
int counter = state.counter.value;
return Center(
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('$counter'),
),
// ...
],
),
);
},
);
}
持久化
默认情况下,模型仅保存在内存中。为了持久化数据,可以在 main.dart
中配置持久化:
WidgetsFlutterBinding.ensureInitialized();
Directory dir = await getApplicationDocumentsDirectory();
await MustangStore.configPersistence(UnifiedConstants.persistentStoreName, dir.path);
await MustangStore.restoreState(app_serializer.json2Type, app_serializer.serializerNames);
缓存
缓存允许在需要时切换同一类型的实例。每个服务实例都有以下缓存相关API:
Future<void> addObjectToCache<T>(String key, T t);
Future<void> deleteObjectsFromCache(String key);
static Future<void> restoreObjects(
String key,
void Function(void Function<T>(T t) update, String modelName, String jsonStr,) callback,
);
bool itemExistsInCache(String key);
事件
事件用于处理应用中的各种事件,如互联网连接事件、服务器数据更新事件等。创建事件模型时需要标注 @appEvent
。
@appModel
@appEvent
abstract class $TimerEvent {
@InitField(0)
late int value;
}
// 订阅事件
Widget build(BuildContext context) {
return MaterialApp(
navigatorObservers: [
MustangRouteObserver.getInstance(),
],
);
}
// 发布事件
connectivity_plus.Connectivity().onConnectivityChanged.listen((var connectivityResult) {
EventStream.pushEvent(mustangAppConfig);
});
切面
切面是定义在方法上的钩子,可以改变执行流。Mustang支持三种切面类型:Before、After 和 Around。
@aspect
abstract class $BeforeAspectExample {
@invoke
Future<void> run(Map<String, dynamic> args) async { }
}
@Before([r'$BeforeAspectExample'], args: {'one': 1, 'two': 2.2})
Future<void> requestCode() async { }
项目结构
项目结构如下:
lib/
- main.dart
- src
- models/
- model1.dart
- model2.dart
- screens/
- first/
- ext/
- first_extension_service.dart
- second_extension_service.dart
- widgets/
- first_widget.dart
- second_widget.dart
- first_screen.dart
- first_state.dart
- first_service.dart
- second/
- ext/
- first_extension_service.dart
- second_extension_service.dart
- widgets/
- first_widget.dart
- second_widget.dart
- second_screen.dart
- second_state.dart
- second_service.dart
快速开始
以下是如何快速开始使用 mustang_core 创建一个简单的计数器应用:
安装依赖
mkdir -p ~/lib && cd ~/lib
git clone https://github.com/flutter/flutter.git -b stable
export PATH=$PATH:~/lib/flutter/bin
export PATH=$PATH:~/.pub-cache/bin
dart pub global activate open_mustang_cli
cd /tmp
flutter create quick_start
cd quick_start
flutter pub get
omcli -s counter
omcli -w
更新模型、屏幕和服务
// counter.model.dart
@appModel
abstract class $Counter {
@InitField(0)
late int value;
}
// counter_screen.dart
import 'package:flutter/material.dart';
import 'package:mustang_widgets/mustang_widgets.dart';
import 'counter_service.service.dart';
import 'counter_state.state.dart';
class CounterScreen extends StatelessWidget {
const CounterScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MustangScreen<CounterState>(
state: CounterState(context: context),
builder: (BuildContext context, CounterState state) {
int counter = state.counter.value;
return Scaffold(
appBar: AppBar(title: const Text('Hello Mustang')),
body: Center(
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('$counter'),
),
ElevatedButton(
onPressed: CounterService().increment,
child: const Text('Increment'),
),
],
),
),
);
},
);
}
}
// counter_service.dart
import 'package:mustang_core/mustang_core.dart';
import 'package:quick_start/src/models/counter.model.dart';
@screenService
abstract class CounterService {
void increment() {
Counter counter = MustangStore.get<Counter>() ?? Counter();
counter = counter.rebuild((b) => b.value = (b.value ?? 0) + 1);
updateState1(counter);
}
}
更新 main.dart
import 'package:flutter/material.dart';
import 'src/screens/counter/counter_screen.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: CounterScreen(),
);
}
}
通过以上步骤,您已经成功创建了一个使用 mustang_core 的简单计数器应用。希望这些信息对您有所帮助!
更多关于Flutter核心功能扩展插件mustang_core的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter核心功能扩展插件mustang_core的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于Flutter核心功能扩展插件mustang_core
的使用,以下是一个简单的代码案例来展示其基本功能和集成方式。mustang_core
是一个功能丰富的插件,通常用于增强Flutter应用的核心功能,如状态管理、路由管理等。以下是一个基本的集成和使用的示例。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加mustang_core
依赖:
dependencies:
flutter:
sdk: flutter
mustang_core: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
2. 初始化应用
在你的main.dart
文件中,初始化MustangCore
并配置你的应用。
import 'package:flutter/material.dart';
import 'package:mustang_core/mustang_core.dart';
void main() {
// 初始化MustangCore
MustangCore.init(
config: MustangConfig(
// 你可以在这里配置MustangCore的各种选项
),
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MustangApp(
home: HomeScreen(),
routes: {
'/second': (context) => SecondScreen(),
},
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Screen'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
MustangCore.navigator.pushNamed(context, '/second');
},
child: Text('Go to Second Screen'),
),
),
);
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Screen'),
),
body: Center(
child: Text('You are on the second screen!'),
),
);
}
}
3. 使用MustangCore的状态管理功能
mustang_core
通常还包含状态管理功能,这里我们假设它提供了一个简单的状态管理示例。如果mustang_core
提供了类似Provider
或Riverpod
的功能,你可以这样使用:
import 'package:flutter/material.dart';
import 'package:mustang_core/mustang_core.dart'; // 假设状态管理功能在这里
// 定义一个简单的状态模型
class CounterState {
int count = 0;
}
void main() {
MustangCore.init(
config: MustangConfig(),
);
// 初始化状态
final counterState = MustangCore.stateContainer<CounterState>(() => CounterState());
runApp(MustangApp(
home: HomeScreen(counterState: counterState),
));
}
class HomeScreen extends StatelessWidget {
final MustangState<CounterState> counterState;
HomeScreen({required this.counterState});
void increment() {
counterState.update((state) {
state.count++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Counter'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'${counterState.data.count}',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: increment,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
注意
- 上述代码是一个假设性的示例,因为
mustang_core
的具体API和功能可能会有所不同。 - 请查阅
mustang_core
的官方文档和源代码以获取最准确和最新的信息。 - 如果
mustang_core
提供了不同的状态管理或路由管理API,请根据文档进行相应的调整。
这个示例展示了如何初始化mustang_core
,配置路由,并使用假设的状态管理功能。根据你的实际需求,你可能需要调整代码以适应mustang_core
的具体实现。