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,21 @@
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> {
${upperName}Bloc(${upperName}State initialState) : super(initialState){
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(error.toString());
},
);
});
}
}

View File

@@ -0,0 +1,34 @@
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});
}
class Un${upperName}Event extends ${upperName}Event {
@override
Stream<${upperName}State> applyAsync({${upperName}State? currentState, ${upperName}Bloc? bloc}) async* {
yield Un${upperName}State();
}
}
class Load${upperName}Event extends ${upperName}Event {
@override
Stream<${upperName}State> applyAsync(
{${upperName}State? currentState, ${upperName}Bloc? bloc}) async* {
try {
yield Un${upperName}State();
await Future.delayed(const Duration(seconds: 1));
yield In${upperName}State('Hello world');
} catch (_, stackTrace) {
developer.log('$_', name: 'Load${upperName}Event', error: _, stackTrace: stackTrace);
yield Error${upperName}State( _.toString());
}
}
}

View File

View File

@@ -0,0 +1,13 @@
import 'package:equatable/equatable.dart';
/// use https://marketplace.visualstudio.com/items?itemName=BendixMa.dart-data-class-generator
class ${upperName}Model extends Equatable {
final int id;
final String name;
${upperName}Model(this.id, this.name);
@override
List<Object> get props => [id, name];
}

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(Un${upperName}State());
@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,84 @@
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: RaisedButton(
color: 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),
],
),
);
}
return Center(
child: CircularProgressIndicator(),
);
});
}
void _load() {
widget._${privateName}Bloc.add(Load${upperName}Event());
}
}

View File

@@ -0,0 +1,42 @@
import 'package:equatable/equatable.dart';
abstract class ${upperName}State extends Equatable {
${upperName}State();
@override
List<Object> get props => [];
}
/// UnInitialized
class Un${upperName}State extends ${upperName}State {
Un${upperName}State();
@override
String toString() => 'Un${upperName}State';
}
/// Initialized
class In${upperName}State extends ${upperName}State {
In${upperName}State(this.hello);
final String hello;
@override
String toString() => 'In${upperName}State $hello';
@override
List<Object> get props => [hello];
}
class Error${upperName}State extends ${upperName}State {
Error${upperName}State(this.errorMessage);
final String errorMessage;
@override
String toString() => 'Error${upperName}State';
@override
List<Object> get props => [errorMessage];
}