· 2 years ago · Apr 08, 2023, 01:01 PM
1import 'package:flutter/material.dart';
2import 'package:http/http.dart' as http;
3import 'dart:convert';
4import 'package:provider/provider.dart';
5
6void main() {
7 runApp(
8 ChangeNotifierProvider<ActivityModel>(
9 create: (context) => ActivityModel(aktivitas: "-", jenis: "-"),
10 child: const MyApp(),
11 ),
12 );
13}
14
15// menampung data hasil pemanggilan API
16
17class ActivityModel extends ChangeNotifier {
18 String url = "https://www.boredapi.com/api/activity";
19
20 String aktivitas;
21 String jenis;
22
23 ActivityModel({required this.aktivitas, required this.jenis}); //constructor
24
25 //map dari json ke atribut
26 void setFromJson(Map<String, dynamic> json) {
27 aktivitas = json['activity'];
28 jenis = json['type'];
29 notifyListeners(); //infokan bahwa data berubah
30 }
31
32 void fetchData() async {
33 final response = await http.get(Uri.parse(url));
34 if (response.statusCode == 200) {
35 setFromJson(jsonDecode(response.body));
36 } else {
37 throw Exception('Gagal load');
38 }
39 }
40}
41
42class MyApp extends StatelessWidget {
43 const MyApp({Key? key}) : super(key: key);
44
45 @override
46 Widget build(Object context) {
47 return MaterialApp(
48 home: Scaffold(
49 body: Center(
50 child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [
51 Consumer<ActivityModel>(
52 builder: (context, aktivitas, child) {
53 return Center(
54 child: Column(
55 mainAxisAlignment: MainAxisAlignment.center,
56 children: [
57 Padding(
58 padding: const EdgeInsets.only(bottom: 20),
59 child: ElevatedButton(
60 onPressed: () {
61 //futureActivity = fetchData();
62 aktivitas.fetchData();
63 },
64 child: const Text("Saya bosan ..."),
65 ),
66 ),
67 Text(aktivitas.aktivitas),
68 Text("Jenis: ${aktivitas.jenis}")
69 ]));
70 },
71 ),
72 ]),
73 ),
74 ));
75 }
76}
77