Flutter架构设计插件architecture的使用
Flutter架构设计插件architecture的使用
特性
- 比Bloc模式具有更高的灵活性
- 使用简单
- 易于测试
- 易于维护
开始使用
为了完全使用此插件,你需要安装以下依赖包:
使用方法
创建模型类
首先,创建你的模型类,如下所示:
import 'package:sealed_class_annotations/sealed_class_annotations.dart';
part 'signin_ui_state.sealed.dart';
@Sealed()
abstract class _SignInUIState {
void showContent(
bool isSignIn,
bool isLoading,
String? errorMessage,
);
}
@Sealed()
abstract class _SignInUIAction {
void showResetPasswordDialog();
}
创建委托类
然后,创建你的委托类如下:
class SignInUiDelegate extends UIDelegate<SignInUIState, SignInUIAction> {
bool _isSignIn = true;
bool _isLoading = false;
SignInUiDelegate(this.authenticationApiHandler);
void init() {
_updateTheUi();
}
void tabSwitched(int index) {
_isSignIn = index == 0;
_updateTheUi();
}
void _updateTheUi({String? errorMessage}) {
add(
SignInUIState.showContent(
isSignIn: _isSignIn,
isLoading: _isLoading,
errorMessage: errorMessage,
),
);
}
void resetPasswordPressed() {
addAction(const SignInUIAction.showResetPasswordDialog());
}
Future<String> resetPassword(String email) {
return authenticationApiHandler.resetEmail(email);
}
void signInSignupButtonPressed({
required String email,
required String password,
}) {
_isLoading = true;
_updateTheUi();
if (_isSignIn) {
authenticationApiHandler
.signinViaEmail(
email: email,
password: password,
)
.then((value) {
_isLoading = false;
AppNavigation.openHome();
}).onError((error, stackTrace) {
debugPrint(error.toString());
_isLoading = false;
_updateTheUi(errorMessage: "登录失败!");
});
} else {
authenticationApiHandler
.signupViaEmail(
email: email,
password: password,
)
.then((value) {
_isLoading = false;
AppNavigation.openHome();
}).onError((error, stackTrace) {
debugPrint(error.toString());
_isLoading = false;
_updateTheUi(errorMessage: "注册失败!");
});
}
}
}
在UI类中使用
在你的UI类中,你可以这样使用它:
class MyLoginPage extends StatefulWidget {
final SignInUiDelegate delegate;
MyLoginPage({required this.delegate});
[@override](/user/override)
_MyLoginPageState createState() => _MyLoginPageState();
}
class _MyLoginPageState extends State<MyLoginPage> {
[@override](/user/override)
void initState() {
super.initState();
widget.delegate.init();
widget.delegate.uiActions().listen((event) {
event.when(
showResetPasswordDialog: () => // 显示重置密码对话框,
);
});
}
[@override](/user/override)
void dispose() {
widget.delegate.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return widget.delegate.getBuilder(
builder: (uiState) => uiState.when(
showContent: (isSignIn, isLoading, errorMessage) =>
_buildContent(isSignIn, isLoading, errorMessage).padding(horizontal: 16, vertical: 16),
),
);
}
Widget _buildContent(bool isSignIn, bool isLoading, String? errorMessage) {
return Column(
children: [
Text(isLoading ? '加载中...' : isSignIn ? '登录' : '注册'),
if (errorMessage != null) Text(errorMessage, style: TextStyle(color: Colors.red)),
// 其他UI元素
],
);
}
}
更多关于Flutter架构设计插件architecture的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter架构设计插件architecture的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,architecture
插件通常是指一些帮助开发者更好地组织和管理应用架构的工具或库。这些插件可以帮助你实现诸如状态管理、依赖注入、路由管理等常见的架构模式。以下是一些常见的Flutter架构设计插件及其使用方法:
1. Provider
Provider
是Flutter中非常流行的状态管理库,它基于InheritedWidget
,提供了简单且高效的状态管理方式。
安装
dependencies:
flutter:
sdk: flutter
provider: ^6.0.0
使用示例
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Counter with ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => Counter(),
child: MaterialApp(
home: HomeScreen(),
),
);
}
}
class HomeScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final counter = Provider.of<Counter>(context);
return Scaffold(
appBar: AppBar(title: Text('Provider Example')),
body: Center(
child: Text('Count: ${counter.count}'),
),
floatingActionButton: FloatingActionButton(
onPressed: () => counter.increment(),
child: Icon(Icons.add),
),
);
}
}
void main() => runApp(MyApp());
2. Riverpod
Riverpod
是 Provider
的改进版,提供了更类型安全的状态管理方式。
安装
dependencies:
flutter:
sdk: flutter
flutter_riverpod: ^1.0.0
使用示例
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final counterProvider = StateProvider<int>((ref) => 0);
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return ProviderScope(
child: MaterialApp(
home: HomeScreen(),
),
);
}
}
class HomeScreen extends ConsumerWidget {
[@override](/user/override)
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return Scaffold(
appBar: AppBar(title: Text('Riverpod Example')),
body: Center(
child: Text('Count: $count'),
),
floatingActionButton: FloatingActionButton(
onPressed: () => ref.read(counterProvider.notifier).state++,
child: Icon(Icons.add),
),
);
}
}
void main() => runApp(MyApp());
3. GetX
GetX
是一个轻量级但功能强大的Flutter库,提供了状态管理、依赖注入、路由管理等功能。
安装
dependencies:
flutter:
sdk: flutter
get: ^4.6.1
使用示例
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class CounterController extends GetxController {
var count = 0.obs;
void increment() => count++;
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return GetMaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
final CounterController counterController = Get.put(CounterController());
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('GetX Example')),
body: Center(
child: Obx(() => Text('Count: ${counterController.count}')),
),
floatingActionButton: FloatingActionButton(
onPressed: () => counterController.increment(),
child: Icon(Icons.add),
),
);
}
}
void main() => runApp(MyApp());
4. Bloc
Bloc
是一个基于事件驱动状态管理的库,适合处理复杂的状态逻辑。
安装
dependencies:
flutter:
sdk: flutter
flutter_bloc: ^8.0.1
使用示例
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class CounterEvent {}
class IncrementEvent extends CounterEvent {}
class CounterBloc extends Bloc<CounterEvent, int> {
CounterBloc() : super(0);
[@override](/user/override)
Stream<int> mapEventToState(CounterEvent event) async* {
if (event is IncrementEvent) {
yield state + 1;
}
}
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: BlocProvider(
create: (context) => CounterBloc(),
child: HomeScreen(),
),
);
}
}
class HomeScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final counterBloc = BlocProvider.of<CounterBloc>(context);
return Scaffold(
appBar: AppBar(title: Text('Bloc Example')),
body: Center(
child: BlocBuilder<CounterBloc, int>(
builder: (context, count) {
return Text('Count: $count');
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => counterBloc.add(IncrementEvent()),
child: Icon(Icons.add),
),
);
}
}
void main() => runApp(MyApp());
5. MobX
MobX
是一个状态管理库,通过观察者模式自动管理状态更新。
安装
dependencies:
flutter:
sdk: flutter
mobx: ^2.0.0
flutter_mobx: ^2.0.0
使用示例
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:mobx/mobx.dart';
part 'counter.g.dart'; // 自动生成的代码
class Counter = _Counter with _$Counter;
abstract class _Counter with Store {
[@observable](/user/observable)
int count = 0;
[@action](/user/action)
void increment() {
count++;
}
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final counter = Counter();
return MaterialApp(
home: HomeScreen(counter),
);
}
}
class HomeScreen extends StatelessWidget {
final Counter counter;
HomeScreen(this.counter);
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('MobX Example')),
body: Center(
child: Observer(
builder: (_) => Text('Count: ${counter.count}'),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => counter.increment(),
child: Icon(Icons.add),
),
);
}
}
void main() => runApp(MyApp());