game html dan DIO
This commit is contained in:
+1
-1
@@ -13,7 +13,7 @@ void main() async {
|
||||
|
||||
await SystemChrome.setPreferredOrientations([
|
||||
DeviceOrientation.portraitUp,
|
||||
DeviceOrientation.portraitDown, // bisa dihapus jika hanya ingin satu arah
|
||||
DeviceOrientation.portraitDown,
|
||||
]);
|
||||
|
||||
runApp(const MyApp());
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
class Users {
|
||||
int id;
|
||||
// String nama;
|
||||
// String tgl;
|
||||
// String? alamat;
|
||||
|
||||
Users({
|
||||
required this.id,
|
||||
// required this.nama, this.alamat, required this.tgl
|
||||
});
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
return {
|
||||
"id": id,
|
||||
// "nama": nama, "alamat": this.alamat, "tgl": this.tgl
|
||||
};
|
||||
}
|
||||
|
||||
factory Users.fromJson(Map<String, dynamic> map) {
|
||||
return Users(
|
||||
id: map['id'],
|
||||
// nama: map['nama'],
|
||||
// alamat: map['alamat'],
|
||||
// tgl: map['tanggal'],
|
||||
);
|
||||
}
|
||||
|
||||
String toString() {
|
||||
return 'Users{id:$id,}';
|
||||
}
|
||||
}
|
||||
@@ -52,11 +52,13 @@ class _ListDetailScreenState extends State<ListDetailScreen> {
|
||||
await controller.loadData(
|
||||
data: html,
|
||||
baseUrl: WebUri(
|
||||
"http://localhost/$base",
|
||||
"file:///android_asset/flutter_assets/$base",
|
||||
), // agar path relatif seperti img1/* jalan
|
||||
mimeType: 'text/html',
|
||||
encoding: 'utf-8',
|
||||
);
|
||||
debugPrint("http://localhost/$base");
|
||||
debugPrint("file:///android_asset/flutter_assets/$base");
|
||||
},
|
||||
onLoadStop: (controller, url) async {
|
||||
debugPrint("🚀 onLoadStop called. URL: $url");
|
||||
|
||||
@@ -6,10 +6,13 @@ import 'package:flutter/services.dart';
|
||||
import 'package:freekake/components/card_list.dart';
|
||||
import 'package:freekake/components/collection_container%20copy.dart';
|
||||
import 'package:freekake/helpers/color_helper.dart';
|
||||
import 'package:freekake/models/users.dart';
|
||||
import 'package:freekake/screen/pustaka/list_detail_screen.dart';
|
||||
import 'package:freekake/util/api_client.dart';
|
||||
import 'package:list_detail_extension/list_detail_extension.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
import 'package:flutter/foundation.dart' show kIsWeb;
|
||||
import 'package:dio/dio.dart';
|
||||
|
||||
class ListEducation extends StatefulWidget {
|
||||
final String? selectedCategory;
|
||||
@@ -27,6 +30,12 @@ class _ListEducationState extends State<ListEducation> {
|
||||
String? selectedCategory;
|
||||
final listDetailExtension = ListDetailExtension();
|
||||
|
||||
// Data fetch
|
||||
final ApiClient _apiClient = ApiClient();
|
||||
List<Users> _posts = [];
|
||||
bool _isLoading = true;
|
||||
String _error = '';
|
||||
|
||||
Future<void> _initExtension() async {
|
||||
await listDetailExtension.load();
|
||||
}
|
||||
@@ -165,6 +174,41 @@ class _ListEducationState extends State<ListEducation> {
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _fetchPosts() async {
|
||||
try {
|
||||
setState(() {
|
||||
_isLoading = true;
|
||||
_error = '';
|
||||
});
|
||||
|
||||
// Melakukan permintaan GET ke endpoint
|
||||
final Response response = await _apiClient.dio.get('auth/users');
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
// Konversi data JSON ke List
|
||||
List<dynamic> postJson = response.data;
|
||||
_posts = postJson.map((json) => Users.fromJson(json)).toList();
|
||||
} else {
|
||||
_error = 'Gagal memuat data: ${response.statusCode}';
|
||||
}
|
||||
} on DioException catch (e) {
|
||||
if (e.response != null) {
|
||||
_error =
|
||||
'Server Error: ${e.response?.statusCode} - ${e.response?.statusMessage}';
|
||||
} else {
|
||||
_error = 'Network Error: ${e.message}';
|
||||
}
|
||||
print('DioError: $e');
|
||||
} catch (e) {
|
||||
_error = 'Terjadi kesalahan tidak terduga: $e';
|
||||
print('General Error: $e');
|
||||
} finally {
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final List<Map<String, dynamic>> collections = [
|
||||
|
||||
@@ -328,13 +328,17 @@ class _PustakaScreenState extends State<PustakaScreen> {
|
||||
Positioned(bottom: 0, left: 0, right: 0, child: MainMenu()),
|
||||
],
|
||||
),
|
||||
Positioned(
|
||||
bottom: bottomPadding * 98,
|
||||
left: (screenWidth - buttonScanSize) / 2,
|
||||
child: Transform.translate(
|
||||
offset: Offset(0, -20),
|
||||
child: ScanButton(),
|
||||
),
|
||||
Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
bottom: bottomPadding * 98,
|
||||
left: (screenWidth - buttonScanSize) / 2,
|
||||
child: Transform.translate(
|
||||
offset: Offset(0, -20),
|
||||
child: ScanButton(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
import 'package:dio/dio.dart';
|
||||
|
||||
class ApiClient {
|
||||
final Dio _dio = Dio();
|
||||
final String _baseUrl = 'https://api.freekake.com/';
|
||||
|
||||
ApiClient() {
|
||||
_dio.options.baseUrl = _baseUrl;
|
||||
_dio.options.connectTimeout = const Duration(seconds: 5);
|
||||
_dio.options.receiveTimeout = const Duration(seconds: 3);
|
||||
|
||||
_dio.interceptors.add(
|
||||
InterceptorsWrapper(
|
||||
onRequest: (options, handler) {
|
||||
print('REQUEST[${options.method}] => PATH: ${options.path}');
|
||||
// options.headers['Authorization'] = 'Bearer your_token_here';
|
||||
return handler.next(options);
|
||||
},
|
||||
onResponse: (response, handler) {
|
||||
print(
|
||||
'RESPONSE[${response.statusCode}] => PATH: ${response.requestOptions.path}',
|
||||
);
|
||||
return handler.next(response);
|
||||
},
|
||||
onError: (DioException e, handler) {
|
||||
print(
|
||||
'ERROR[${e.response?.statusCode}] => PATH: ${e.requestOptions.path}',
|
||||
);
|
||||
return handler.next(e);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Dio get dio => _dio;
|
||||
}
|
||||
Reference in New Issue
Block a user