API Table Investasi Admin

This commit is contained in:
2025-02-04 22:35:44 +08:00
parent 257c1ebaad
commit c53ca6d355
40 changed files with 1737 additions and 378 deletions

View 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);
}

View 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());
}
}
}

View File

View 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;
}
}

View 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),
);
}
}

View 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');
}
}
}

View 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);
}
}

View 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));
}
}

View 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];
}