页面视图功能
一个用于创建目录结构和样板代码的砖块,用于实现利用页面切换视图模式的功能。
有关此模式的更多信息,请查看这篇 博客。
注意:此砖块对视图小部件使用超级初始化器。因此,请确保您使用的是 dart 2.17 版本。
? 如何使用
mason make page_switcher_view --app_name "cool app" --feature_name whatever
? 变量
| Variable | 描述 |
|---|---|
app_name |
包含新功能的应用程序名称。 |
feature_name |
实现 Page-Switcher-Pattern 的新功能名称 |
✅ 输出
目录结构
├── whatever
│ ├── bloc
│ │ ├── whatever_bloc.dart
│ │ ├── whatever_event.dart
│ │ └── whatever_state.dart
│ ├── view
| | ├── view.dart
│ │ ├── whatever_page.dart
│ │ ├── whatever_switcher.dart
│ │ └── whatever_view.dart
│ ├── widgets
│ │ └── widgets.dart
│ └── whatever.dart
└── ...
文件内容
whatever_bloc.dart
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
part 'whatever_event.dart';
part 'whatever_state.dart';
class WhateverBloc extends Bloc<WhateverEvent, WhateverState> {
WhateverBloc() : super(const WhateverState()) {
on<WhateverDataRequested>(_dataRequested);
}
FutureOr<void> _dataRequested(
WhateverDataRequested event,
Emitter<WhateverState> emit,
) async {
emit(state.copyWith(status: WhateverStatus.loading));
try {
// TODO(you): INITIAL ASYNC CALL
emit(state.copyWith(status: WhateverStatus.success));
} catch (error, stackTrace) {
addError(error, stackTrace);
emit(state.copyWith(status: WhateverStatus.error));
}
}
}
whatever_event.dart
part of 'whatever_bloc.dart';
abstract class WhateverEvent extends Equatable {
const WhateverEvent();
@override
List<Object> get props => [];
}
class WhateverDataRequested extends WhateverEvent {}
whatever_state.dart
part of 'whatever_bloc.dart';
enum WhateverStatus { initial, loading, success, error }
class WhateverState extends Equatable {
const WhateverState({this.status = WhateverStatus.initial});
final WhateverStatus status;
@override
List<Object> get props => [status];
WhateverState copyWith({
WhateverStatus? status,
}) {
return WhateverState(
status: status ?? this.status,
);
}
}
view.dart
export 'whatever_page.dart';
export 'whatever_switcher.dart';
export 'whatever_view.dart';
whatever_page.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:cool_app/whatever/whatever.dart';
class WhateverPage extends StatelessWidget {
const WhateverPage({super.key});
static String path = 'whatever';
@override
Widget build(BuildContext context) {
return Scaffold(
body: BlocProvider(
create: (context) => WhateverBloc()..add(WhateverDataRequested()),
child: const WhateverSwitcher(),
),
);
}
}
whatever_switcher.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:cool_app/whatever/whatever.dart';
class WhateverSwitcher extends StatelessWidget {
const WhateverSwitcher({super.key});
@override
Widget build(BuildContext context) {
final status = context.select(
(WhateverBloc bloc) => bloc.state.status,
);
switch (status) {
case WhateverStatus.initial:
case WhateverStatus.loading:
// TODO(you): CREATE CUSTOM LOADING VIEW
return const Center(child: CircularProgressIndicator());
case WhateverStatus.success:
return const WhateverView();
case WhateverStatus.error:
// TODO(you): CREATE CUSTOM ERROR VIEW
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Something went wrong.'),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
context.read<WhateverBloc>().add(WhateverDataRequested());
},
child: const Text('Try again'),
),
],
),
);
}
}
}
whatever_success.dart
import 'package:flutter/material.dart';
class WhateverView extends StatelessWidget {
const WhateverView({super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Text('Success'),
);
}
}
widgets.dart
export 'bloc/whatever_bloc.dart';
export 'view/view.dart';
export 'widgets/widgets.dart';