API Table Investasi Admin
This commit is contained in:
37
templates/mutable/bloc.tmpl
Normal file
37
templates/mutable/bloc.tmpl
Normal file
@@ -0,0 +1,37 @@
|
||||
import 'dart:async';
|
||||
import 'dart:developer' as developer;
|
||||
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:${appName}${relative}/index.dart';
|
||||
|
||||
class ${upperName}Bloc extends Bloc<${upperName}Event, ${upperName}State> {
|
||||
// todo: check singleton for logic in project
|
||||
// use GetIt for DI in projct
|
||||
static final ${upperName}Bloc _${privateName}BlocSingleton = ${upperName}Bloc._internal();
|
||||
factory ${upperName}Bloc() {
|
||||
return _${privateName}BlocSingleton;
|
||||
}
|
||||
|
||||
${upperName}Bloc._internal(): super(Un${upperName}State(0)){
|
||||
on<${upperName}Event>((event, emit) {
|
||||
return emit.forEach<${upperName}State>(
|
||||
event.applyAsync(currentState: state, bloc: this),
|
||||
onData: (state) => state,
|
||||
onError: (error, stackTrace) {
|
||||
developer.log('$error', name: '${upperName}Bloc', error: error, stackTrace: stackTrace);
|
||||
return Error${upperName}State(0, error.toString());
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> close() async{
|
||||
// dispose objects
|
||||
await super.close();
|
||||
}
|
||||
|
||||
@override
|
||||
${upperName}State get initialState => Un${upperName}State(0);
|
||||
|
||||
}
|
||||
42
templates/mutable/event.tmpl
Normal file
42
templates/mutable/event.tmpl
Normal file
@@ -0,0 +1,42 @@
|
||||
import 'dart:async';
|
||||
import 'dart:developer' as developer;
|
||||
|
||||
import 'package:${appName}${relative}/index.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
|
||||
@immutable
|
||||
abstract class ${upperName}Event {
|
||||
Stream<${upperName}State> applyAsync(
|
||||
{${upperName}State currentState, ${upperName}Bloc bloc});
|
||||
final ${upperName}Repository _${privateName}Repository = ${upperName}Repository();
|
||||
}
|
||||
|
||||
class Un${upperName}Event extends ${upperName}Event {
|
||||
@override
|
||||
Stream<${upperName}State> applyAsync({${upperName}State? currentState, ${upperName}Bloc? bloc}) async* {
|
||||
yield Un${upperName}State(0);
|
||||
}
|
||||
}
|
||||
|
||||
class Load${upperName}Event extends ${upperName}Event {
|
||||
|
||||
final bool isError;
|
||||
@override
|
||||
String toString() => 'Load${upperName}Event';
|
||||
|
||||
Load${upperName}Event(this.isError);
|
||||
|
||||
@override
|
||||
Stream<${upperName}State> applyAsync(
|
||||
{${upperName}State? currentState, ${upperName}Bloc? bloc}) async* {
|
||||
try {
|
||||
yield Un${upperName}State(0);
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
_${privateName}Repository.test(isError);
|
||||
yield In${upperName}State(0, 'Hello world');
|
||||
} catch (_, stackTrace) {
|
||||
developer.log('$_', name: 'Load${upperName}Event', error: _, stackTrace: stackTrace);
|
||||
yield Error${upperName}State(0, _.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
0
templates/mutable/index.tmpl
Normal file
0
templates/mutable/index.tmpl
Normal file
47
templates/mutable/model.tmpl
Normal file
47
templates/mutable/model.tmpl
Normal file
@@ -0,0 +1,47 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
/// generate by https://javiercbk.github.io/json_to_dart/
|
||||
class Autogenerated${upperName} {
|
||||
final List<${upperName}Model> results;
|
||||
|
||||
Autogenerated${upperName}({required this.results});
|
||||
|
||||
factory Autogenerated${upperName}.fromJson(Map<String, dynamic> json) {
|
||||
var temp = <YouAwesomeModel>[];
|
||||
if (json['results'] != null) {
|
||||
temp = <${upperName}Model>[];
|
||||
json['results'].forEach((v) {
|
||||
temp.add(${upperName}Model.fromJson(v as Map<String, dynamic>));
|
||||
});
|
||||
}
|
||||
return Autogenerated${upperName}(results: temp);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final data = <String, dynamic>{};
|
||||
data['results'] = results.map((v) => v.toJson()).toList();
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class ${upperName}Model extends Equatable {
|
||||
final int id;
|
||||
final String name;
|
||||
|
||||
${upperName}Model(this.id, this.name);
|
||||
|
||||
@override
|
||||
List<Object> get props => [id, name];
|
||||
|
||||
factory ${upperName}Model.fromJson(Map<String, dynamic> json) {
|
||||
return ${upperName}Model(json['id'] as int, json['name'] as String);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final data = <String, dynamic>{};
|
||||
data['id'] = id;
|
||||
data['name'] = name;
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
23
templates/mutable/page.tmpl
Normal file
23
templates/mutable/page.tmpl
Normal file
@@ -0,0 +1,23 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:${appName}${relative}/index.dart';
|
||||
|
||||
class ${upperName}Page extends StatefulWidget {
|
||||
static const String routeName = '/${privateName}';
|
||||
|
||||
@override
|
||||
_${upperName}PageState createState() => _${upperName}PageState();
|
||||
}
|
||||
|
||||
class _${upperName}PageState extends State<${upperName}Page> {
|
||||
final _${privateName}Bloc = ${upperName}Bloc();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text('${upperName}'),
|
||||
),
|
||||
body: ${upperName}Screen(${privateName}Bloc: _${privateName}Bloc),
|
||||
);
|
||||
}
|
||||
}
|
||||
20
templates/mutable/provider.tmpl
Normal file
20
templates/mutable/provider.tmpl
Normal file
@@ -0,0 +1,20 @@
|
||||
import 'dart:async';
|
||||
|
||||
class ${upperName}Provider {
|
||||
Future<void> loadAsync(String token) async {
|
||||
/// write from keystore/keychain
|
||||
await Future.delayed(Duration(seconds: 2));
|
||||
}
|
||||
|
||||
Future<void> saveAsync(String token) async {
|
||||
/// write from keystore/keychain
|
||||
await Future.delayed(Duration(seconds: 2));
|
||||
}
|
||||
|
||||
void test(bool isError) {
|
||||
if (isError == true){
|
||||
throw Exception('manual error');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
11
templates/mutable/repository.tmpl
Normal file
11
templates/mutable/repository.tmpl
Normal file
@@ -0,0 +1,11 @@
|
||||
import 'package:${appName}${relative}/index.dart';
|
||||
|
||||
class ${upperName}Repository {
|
||||
final ${upperName}Provider _${privateName}Provider = ${upperName}Provider();
|
||||
|
||||
${upperName}Repository();
|
||||
|
||||
void test(bool isError) {
|
||||
_${privateName}Provider.test(isError);
|
||||
}
|
||||
}
|
||||
97
templates/mutable/screen.tmpl
Normal file
97
templates/mutable/screen.tmpl
Normal file
@@ -0,0 +1,97 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:${appName}${relative}/index.dart';
|
||||
|
||||
class ${upperName}Screen extends StatefulWidget {
|
||||
const ${upperName}Screen({
|
||||
required ${upperName}Bloc ${privateName}Bloc,
|
||||
Key? key,
|
||||
}) : _${privateName}Bloc = ${privateName}Bloc,
|
||||
super(key: key);
|
||||
|
||||
final ${upperName}Bloc _${privateName}Bloc;
|
||||
|
||||
@override
|
||||
${upperName}ScreenState createState() {
|
||||
return ${upperName}ScreenState();
|
||||
}
|
||||
}
|
||||
|
||||
class ${upperName}ScreenState extends State<${upperName}Screen> {
|
||||
${upperName}ScreenState();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_load();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<${upperName}Bloc, ${upperName}State>(
|
||||
bloc: widget._${privateName}Bloc,
|
||||
builder: (
|
||||
BuildContext context,
|
||||
${upperName}State currentState,
|
||||
) {
|
||||
if (currentState is Un${upperName}State) {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
}
|
||||
if (currentState is Error${upperName}State) {
|
||||
return Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(currentState.errorMessage),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 32.0),
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.blue,
|
||||
),
|
||||
child: Text('reload'),
|
||||
onPressed: _load,
|
||||
),
|
||||
),
|
||||
],
|
||||
));
|
||||
}
|
||||
if (currentState is In${upperName}State) {
|
||||
return Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(currentState.hello),
|
||||
const Text('Flutter files: done'),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 32.0),
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red,
|
||||
),
|
||||
child: Text('throw error'),
|
||||
onPressed: () => _load(true),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
return Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
void _load([bool isError = false]) {
|
||||
widget._${privateName}Bloc.add(Load${upperName}Event(isError));
|
||||
}
|
||||
}
|
||||
83
templates/mutable/state.tmpl
Normal file
83
templates/mutable/state.tmpl
Normal file
@@ -0,0 +1,83 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
abstract class ${upperName}State extends Equatable {
|
||||
${upperName}State(this.version);
|
||||
|
||||
/// notify change state without deep clone state
|
||||
final int version;
|
||||
|
||||
/// Copy object for use in action
|
||||
/// if need use deep clone
|
||||
${upperName}State getStateCopy();
|
||||
|
||||
${upperName}State getNewVersion();
|
||||
|
||||
@override
|
||||
List<Object> get props => [version];
|
||||
}
|
||||
|
||||
/// UnInitialized
|
||||
class Un${upperName}State extends ${upperName}State {
|
||||
|
||||
Un${upperName}State(int version) : super(version);
|
||||
|
||||
@override
|
||||
String toString() => 'Un${upperName}State';
|
||||
|
||||
@override
|
||||
Un${upperName}State getStateCopy() {
|
||||
return Un${upperName}State(0);
|
||||
}
|
||||
|
||||
@override
|
||||
Un${upperName}State getNewVersion() {
|
||||
return Un${upperName}State(version+1);
|
||||
}
|
||||
}
|
||||
|
||||
/// Initialized
|
||||
class In${upperName}State extends ${upperName}State {
|
||||
|
||||
In${upperName}State(int version, this.hello) : super(version);
|
||||
|
||||
final String hello;
|
||||
|
||||
@override
|
||||
String toString() => 'In${upperName}State $hello';
|
||||
|
||||
@override
|
||||
In${upperName}State getStateCopy() {
|
||||
return In${upperName}State(version, hello);
|
||||
}
|
||||
|
||||
@override
|
||||
In${upperName}State getNewVersion() {
|
||||
return In${upperName}State(version+1, hello);
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object> get props => [version, hello];
|
||||
}
|
||||
|
||||
class Error${upperName}State extends ${upperName}State {
|
||||
Error${upperName}State(int version, this.errorMessage): super(version);
|
||||
|
||||
final String errorMessage;
|
||||
|
||||
@override
|
||||
String toString() => 'Error${upperName}State';
|
||||
|
||||
@override
|
||||
Error${upperName}State getStateCopy() {
|
||||
return Error${upperName}State(version, errorMessage);
|
||||
}
|
||||
|
||||
@override
|
||||
Error${upperName}State getNewVersion() {
|
||||
return Error${upperName}State(version+1,
|
||||
errorMessage);
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object> get props => [version, errorMessage];
|
||||
}
|
||||
Reference in New Issue
Block a user