From b5b3eb19ea8d782c122dcafa9a6b5c844a1b141c Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Sun, 19 Dec 2021 21:01:56 +0100 Subject: [PATCH 01/17] use HashMap instead of Map --- lib/src/mc_llistenable.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/mc_llistenable.dart b/lib/src/mc_llistenable.dart index 595c9d8..ba323cd 100644 --- a/lib/src/mc_llistenable.dart +++ b/lib/src/mc_llistenable.dart @@ -1,7 +1,8 @@ +import 'dart:collection'; import 'dart:ui'; abstract class McListenable { - Map> _observers = {}; + HashMap> _observers = HashMap(); List merges = []; bool get isMerged { return merges.isNotEmpty; From 5fd0e4fdc1feae4ace9878e7dc462f46121609a9 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Sun, 19 Dec 2021 22:39:39 +0100 Subject: [PATCH 02/17] use LinkedList instead of List --- lib/src/mc_extensions.dart | 18 ++++++++++++++++++ lib/src/mc_llistenable.dart | 33 +++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/lib/src/mc_extensions.dart b/lib/src/mc_extensions.dart index 3aadfde..585b23a 100644 --- a/lib/src/mc_extensions.dart +++ b/lib/src/mc_extensions.dart @@ -1,6 +1,24 @@ +import 'dart:collection'; +import 'dart:ui'; + import 'package:mc/src/mc_controller.dart'; +import 'mc_llistenable.dart'; + /// Extensions helper extension McInObj on Object { McController get mc => McController(); } + +extension CustomLinkedList on LinkedList> { + void removeWhere(bool test(MyLinkedListEntry element)) { + MyLinkedListEntry? willRemove; + forEach((entry) { + if (test(entry)) { + print("hello"); + willRemove = entry; + } + }); + if (willRemove != null) remove(willRemove!); + } +} diff --git a/lib/src/mc_llistenable.dart b/lib/src/mc_llistenable.dart index ba323cd..bf3db93 100644 --- a/lib/src/mc_llistenable.dart +++ b/lib/src/mc_llistenable.dart @@ -1,29 +1,37 @@ import 'dart:collection'; import 'dart:ui'; +import 'mc_extensions.dart'; abstract class McListenable { - HashMap> _observers = HashMap(); + HashMap>> _observers = + HashMap(); List merges = []; bool get isMerged { return merges.isNotEmpty; } void registerListener(String key, VoidCallback listener) { - if (_observers[key] == null) _observers[key] = []; - _observers[key]!.add(listener); + if (_observers[key] == null) + _observers[key] = LinkedList>(); + _observers[key]!.add(MyLinkedListEntry(listener)); } void registerListeners(Map> listeners) { - _observers.addAll(listeners); + listeners.forEach((key, value) { + value.forEach((element) { + _observers[key]!.add(MyLinkedListEntry(element)); + }); + }); } void callListener(String key) { - if (_observers.containsKey(key)) _observers[key]!.forEach((l) => l.call()); + if (_observers.containsKey(key)) + _observers[key]!.forEach((l) => l.callBack.call()); } void callListeners(List keys) { _observers.forEach((key, value) { - if (keys.contains(key)) value.forEach((l) => l.call()); + if (keys.contains(key)) value.forEach((l) => l.callBack.call()); }); } @@ -31,7 +39,7 @@ abstract class McListenable { if (_observers.containsKey(key)) listener == null ? _observers.remove(key) - : _observers[key]!.removeWhere((l) => l == listener); + : _observers[key]!.removeWhere((l) => l.callBack == listener); } void removeListeners(List keys, [List? listeners]) { @@ -47,7 +55,8 @@ abstract class McListenable { } bool keyHasListeners(String key) { - if (_observers[key] == null) _observers[key] = []; + if (_observers[key] == null) + _observers[key] = LinkedList>(); return _observers[key]!.isNotEmpty; } @@ -55,3 +64,11 @@ abstract class McListenable { return _observers.keys.toList(); } } + +class MyLinkedListEntry + extends LinkedListEntry> { + VoidCallback callBack; + MyLinkedListEntry(this.callBack); + @override + String toString() => '${super.toString()}: $callBack'; +} From 2f30749d2a185814cffe60a1086af69045c27fd4 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Sun, 19 Dec 2021 22:45:24 +0100 Subject: [PATCH 03/17] make removeWhere extension support multivalue --- lib/src/mc_extensions.dart | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/src/mc_extensions.dart b/lib/src/mc_extensions.dart index 585b23a..b2d54f1 100644 --- a/lib/src/mc_extensions.dart +++ b/lib/src/mc_extensions.dart @@ -12,13 +12,15 @@ extension McInObj on Object { extension CustomLinkedList on LinkedList> { void removeWhere(bool test(MyLinkedListEntry element)) { - MyLinkedListEntry? willRemove; + List>? removeIt = []; forEach((entry) { if (test(entry)) { - print("hello"); - willRemove = entry; + removeIt.add(entry); } }); - if (willRemove != null) remove(willRemove!); + if (removeIt.isNotEmpty) + removeIt.forEach((entry) { + remove(entry); + }); } } From 7312dc58ec1ca3f7b9e90ef27b5473b20bd4c8a8 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Thu, 23 Dec 2021 21:52:45 +0100 Subject: [PATCH 04/17] null supported for examples --- example/lib/Models/CounterModel.dart | 2 +- example/lib/Models/PhotoModel.dart | 34 ++--- example/lib/Models/PostModel.dart | 32 ++--- example/lib/Models/UserModel.dart | 182 ++++++--------------------- example/lib/Models/user/address.dart | 56 +++++++++ example/lib/Models/user/company.dart | 44 +++++++ example/lib/Models/user/geo.dart | 26 ++++ example/lib/Views/counter_View.dart | 2 +- example/lib/Views/mini_view.dart | 2 +- example/lib/Views/photo_View.dart | 12 +- example/lib/Views/post_View.dart | 16 +-- example/lib/Views/user_View.dart | 106 ++++++++-------- example/lib/main.dart | 4 +- example/pubspec.lock | 17 +-- example/pubspec.yaml | 7 +- 15 files changed, 268 insertions(+), 274 deletions(-) create mode 100644 example/lib/Models/user/address.dart create mode 100644 example/lib/Models/user/company.dart create mode 100644 example/lib/Models/user/geo.dart diff --git a/example/lib/Models/CounterModel.dart b/example/lib/Models/CounterModel.dart index fc41d9f..759f089 100755 --- a/example/lib/Models/CounterModel.dart +++ b/example/lib/Models/CounterModel.dart @@ -6,7 +6,7 @@ class Counter extends McModel { Counter({ this.count = 0, }); - fromJson(Map json) { + fromJson(covariant Map json) { count = json['count'] ?? count; return super.fromJson(json); } diff --git a/example/lib/Models/PhotoModel.dart b/example/lib/Models/PhotoModel.dart index f444eca..79944e3 100755 --- a/example/lib/Models/PhotoModel.dart +++ b/example/lib/Models/PhotoModel.dart @@ -1,23 +1,25 @@ import 'package:mc/mc.dart'; class Photo extends McModel { - List multi; - int albumId; - int id; - String title; - String url; - String thumbnailUrl; + int? albumId; + int? id; + String? title; + String? url; + String? thumbnailUrl; + String albumIdVar = "albumId"; + String idVar = "id"; + String titleVar = "title"; + String urlVar = "url"; + String thumbnailUrlVar = "thumbnailUrl"; Photo({ this.albumId, this.id, this.title, this.url, this.thumbnailUrl, - }) { - multi = multi ?? []; - } - fromJson(Map json) { + }); + fromJson(covariant Map json) { albumId = json['albumId'] ?? albumId; id = json['id'] ?? id; title = json['title'] ?? title; @@ -27,7 +29,7 @@ class Photo extends McModel { } Map toJson() { - final Map data = new Map(); + final Map data = {}; data['albumId'] = this.albumId; data['id'] = this.id; data['title'] = this.title; @@ -36,14 +38,4 @@ class Photo extends McModel { return data; } - - void setMulti(List data) { - List listOfphoto = data.map((e) { - Photo photo = Photo(); - photo.fromJson(e); - return photo; - }).toList(); - multi = listOfphoto; - } } - diff --git a/example/lib/Models/PostModel.dart b/example/lib/Models/PostModel.dart index 105e6d6..8da965b 100755 --- a/example/lib/Models/PostModel.dart +++ b/example/lib/Models/PostModel.dart @@ -1,25 +1,22 @@ import 'package:mc/mc.dart'; class Post extends McModel { - List multi; - int userId; - int id; - String title; - String body; - - final String userIdStr = 'userId'; - final String idStr = 'id'; - final String titleStr = 'title'; - final String bodyStr = 'body'; + int? userId; + int? id; + String? title; + String? body; + String userIdVar = "userId"; + String idVar = "id"; + String titleVar = "title"; + String bodyVar = "body"; Post({ this.userId, this.id, this.title, this.body, }); - - fromJson(Map json) { + fromJson(covariant Map json) { userId = json['userId'] ?? userId; id = json['id'] ?? id; title = json['title'] ?? title; @@ -28,7 +25,7 @@ class Post extends McModel { } Map toJson() { - final Map data = new Map(); + final Map data = {}; data['userId'] = this.userId; data['id'] = this.id; data['title'] = this.title; @@ -36,13 +33,4 @@ class Post extends McModel { return data; } - - void setMulti(List data) { - List listOfpost = data.map((e) { - Post post = Post(); - post.fromJson(e); - return post; - }).toList(); - multi = listOfpost; - } } diff --git a/example/lib/Models/UserModel.dart b/example/lib/Models/UserModel.dart index f45f87b..de63e4b 100755 --- a/example/lib/Models/UserModel.dart +++ b/example/lib/Models/UserModel.dart @@ -1,172 +1,64 @@ +import 'package:example/Models/user/address.dart'; +import 'package:example/Models/user/company.dart'; import 'package:mc/mc.dart'; class User extends McModel { - List multi; - int id; - String name; - String username; - String email; - Address address; - String phone; - String website; - Company company; - String image; - final String idStr = "id"; - final String nameStr = "name"; - final String usernameStr = "username"; - final String emailStr = "email"; - final String addressStr = "address"; - final String phoneStr = "phone"; - final String websiteStr = "website"; - final String companyStr = "company"; - final String imageStr = "img"; - - User( - {this.id, - this.name, - this.username, - this.email, - this.address, - this.phone, - this.website, - this.company, - this.image}) { - multi = multi ?? []; + int? id; + String? name; + String? username; + String? email; + Address? address; + String? phone; + String? website; + Company? company; + String? image; + + String idVar = "id"; + String nameVar = "name"; + String imageVar = "image"; + String usernameVar = "username"; + String emailVar = "email"; + String addressVar = "address"; + String phoneVar = "phone"; + String websiteVar = "website"; + String companyVar = "company"; + User({ + this.id, + this.name, + this.username, + this.email, + this.address, + this.phone, + this.website, + this.company, + }) { address ??= Address(); company ??= Company(); } - fromJson(Map json) { + void fromJson(covariant Map json) { id = json['id'] ?? id; name = json['name'] ?? name; username = json['username'] ?? username; email = json['email'] ?? email; - address.fromJson(json['address'] ?? address.toJson()); + address!.fromJson(json['address'] ?? address!.toJson()); phone = json['phone'] ?? phone; image = json['image'] ?? image; website = json['website'] ?? website; - company.fromJson(json['company'] ?? company.toJson()); + company!.fromJson(json['company'] ?? company!.toJson()); return super.fromJson(json); } Map toJson() { - final Map data = new Map(); + final Map data = {}; data['id'] = this.id; data['name'] = this.name; data['username'] = this.username; data['image'] = this.image; data['email'] = this.email; - data['address'] = this.address.toJson(); + data['address'] = this.address!.toJson(); data['phone'] = this.phone; data['website'] = this.website; - data['company'] = this.company.toJson(); - - return data; - } - - void setMulti(List data) { - List listOfuser = data.map((e) { - User user = User(); - user.fromJson(e); - return user; - }).toList(); - multi = listOfuser; - } -} - -class Geo extends McModel { - List multi; - String lat; - String lng; - - Geo({ - this.lat, - this.lng, - }) { - multi = multi ?? []; - } - fromJson(Map json) { - lat = json['lat'] ?? lat; - lng = json['lng'] ?? lng; - return super.fromJson(json); - } - - Map toJson() { - final Map data = new Map(); - data['lat'] = this.lat; - data['lng'] = this.lng; - - return data; - } - - void setMulti(List data) { - List listOfgeo = data.map((e) { - Geo geo = Geo(); - geo.fromJson(e); - return geo; - }).toList(); - multi = listOfgeo; - } -} - -class Company extends McModel { - String name; - String catchPhrase; - String bs; - - Company({ - this.name, - this.catchPhrase, - this.bs, - }); - fromJson(Map json) { - name = json['name'] ?? name; - catchPhrase = json['catchPhrase'] ?? catchPhrase; - bs = json['bs'] ?? bs; - return super.fromJson(json); - } - - Map toJson() { - final Map data = new Map(); - data['name'] = this.name; - data['catchPhrase'] = this.catchPhrase; - data['bs'] = this.bs; - - return data; - } -} - -class Address extends McModel
{ - String street; - String suite; - String city; - String zipcode; - Geo geo; - - Address({ - this.street, - this.suite, - this.city, - this.zipcode, - this.geo, - }) { - geo ??= Geo(); - } - fromJson(Map json) { - street = json['street'] ?? street; - suite = json['suite'] ?? suite; - city = json['city'] ?? city; - zipcode = json['zipcode'] ?? zipcode; - geo.fromJson(json['geo'] ?? geo.toJson()); - return super.fromJson(json); - } - - Map toJson() { - final Map data = new Map(); - data['street'] = this.street; - data['suite'] = this.suite; - data['city'] = this.city; - data['zipcode'] = this.zipcode; - data['geo'] = this.geo.toJson(); + data['company'] = this.company!.toJson(); return data; } diff --git a/example/lib/Models/user/address.dart b/example/lib/Models/user/address.dart new file mode 100644 index 0000000..27ec568 --- /dev/null +++ b/example/lib/Models/user/address.dart @@ -0,0 +1,56 @@ +import 'package:mc/mc.dart'; + +import 'geo.dart'; + +class Address extends McModel
{ + List
? multi; + String? street; + String? suite; + String? city; + String? zipcode; + Geo? geo; + + String streetVar = "street"; + String suiteVar = "suite"; + String cityVar = "city"; + String zipcodeVar = "zipcode"; + String geoVar = "geo"; + Address({ + this.street, + this.suite, + this.city, + this.zipcode, + this.geo, + }) { + multi = multi ?? []; + geo ??= Geo(); + } + fromJson(covariant Map json) { + street = json['street'] ?? street; + suite = json['suite'] ?? suite; + city = json['city'] ?? city; + zipcode = json['zipcode'] ?? zipcode; + geo!.fromJson(json['geo'] ?? geo!.toJson()); + return super.fromJson(json); + } + + Map toJson() { + final Map data = {}; + data['street'] = this.street; + data['suite'] = this.suite; + data['city'] = this.city; + data['zipcode'] = this.zipcode; + data['geo'] = this.geo!.toJson(); + + return data; + } + + void setMulti(List data) { + List
listOfaddress = data.map((e) { + Address address = Address(); + address.fromJson(e); + return address; + }).toList(); + multi = listOfaddress; + } +} diff --git a/example/lib/Models/user/company.dart b/example/lib/Models/user/company.dart new file mode 100644 index 0000000..b62a5f5 --- /dev/null +++ b/example/lib/Models/user/company.dart @@ -0,0 +1,44 @@ +import 'package:mc/mc.dart'; + +class Company extends McModel { + List? multi; + String? name; + String? catchPhrase; + String? bs; + + String nameVar = "name"; + String catchPhraseVar = "catchPhrase"; + String bsVar = "bs"; + Company({ + this.name, + this.catchPhrase, + this.bs, + }) { + multi = multi ?? []; + } + fromJson(covariant Map json) { + name = json['name'] ?? name; + catchPhrase = json['catchPhrase'] ?? catchPhrase; + bs = json['bs'] ?? bs; + return super.fromJson(json); + } + + Map toJson() { + final Map data = {}; + data['name'] = this.name; + data['catchPhrase'] = this.catchPhrase; + data['bs'] = this.bs; + + return data; + } + + void setMulti(List data) { + + List listOfcompany = data.map((e) { + Company company = Company(); + company.fromJson(e); + return company; + }).toList(); + multi = listOfcompany; + } +} diff --git a/example/lib/Models/user/geo.dart b/example/lib/Models/user/geo.dart new file mode 100644 index 0000000..10e5587 --- /dev/null +++ b/example/lib/Models/user/geo.dart @@ -0,0 +1,26 @@ +import 'package:mc/mc.dart'; + +class Geo extends McModel { + String? lat; + String? lng; + + String latVar = "lat"; + String lngVar = "lng"; + Geo({ + this.lat, + this.lng, + }); + fromJson(covariant Map json) { + lat = json['lat'] ?? lat; + lng = json['lng'] ?? lng; + return super.fromJson(json); + } + + Map toJson() { + final Map data = {}; + data['lat'] = this.lat; + data['lng'] = this.lng; + + return data; + } +} diff --git a/example/lib/Views/counter_View.dart b/example/lib/Views/counter_View.dart index 1e43cef..4583dd2 100755 --- a/example/lib/Views/counter_View.dart +++ b/example/lib/Views/counter_View.dart @@ -4,7 +4,7 @@ import 'package:mc/mc.dart'; class CounterExample extends StatelessWidget { final String title; - CounterExample({this.title}); + CounterExample({required this.title}); final Counter counter = Counter(); @override Widget build(BuildContext context) { diff --git a/example/lib/Views/mini_view.dart b/example/lib/Views/mini_view.dart index c33fa5a..67c9737 100644 --- a/example/lib/Views/mini_view.dart +++ b/example/lib/Views/mini_view.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mc/mc.dart'; class MiniView extends StatelessWidget { - MiniView({this.title}); + MiniView({required this.title}); final String title; final McValue mcString = "Initial value".mini; final McValue mcNum = 5.mini; diff --git a/example/lib/Views/photo_View.dart b/example/lib/Views/photo_View.dart index ec84729..7418e3b 100755 --- a/example/lib/Views/photo_View.dart +++ b/example/lib/Views/photo_View.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:mc/mc.dart'; class PhotoExample extends StatelessWidget { - PhotoExample({this.title}); + PhotoExample({required this.title}); final String title; final Photo photo = McController().add('photos', Photo()); final McRequest request = McController().get('rq'); @@ -23,19 +23,19 @@ class PhotoExample extends StatelessWidget { call: getData, builder: (context) { return ListView.builder( - itemCount: photo.multi.length, + itemCount: photo.multi!.length, itemBuilder: (BuildContext context, int index) { - Photo currentphoto = photo.multi[index]; + Photo currentphoto = photo.multi![index]; return Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ ListTile( - title: Text(currentphoto.title), - leading: Image.network(currentphoto.thumbnailUrl), + title: Text(currentphoto.title!), + leading: Image.network(currentphoto.thumbnailUrl!), ), Image.network( - currentphoto.url, + currentphoto.url!, frameBuilder: (_, child, __, ___) { return Container( decoration: BoxDecoration(boxShadow: [ diff --git a/example/lib/Views/post_View.dart b/example/lib/Views/post_View.dart index 3ee75f6..73690a2 100755 --- a/example/lib/Views/post_View.dart +++ b/example/lib/Views/post_View.dart @@ -9,7 +9,7 @@ class PostExample extends StatelessWidget { final Post post = McController().add('posts', Post(), readOnly: true); // get request by key final McRequest request = McController().get("rq"); - PostExample({this.title}); + PostExample({required this.title}); final String title; @override Widget build(BuildContext context) { @@ -62,13 +62,13 @@ class PostExample extends StatelessWidget { return Container( height: MediaQuery.of(context).size.height * 0.852, child: ListView.builder( - itemCount: post.multi.length, + itemCount: post.multi!.length, itemBuilder: (BuildContext context, int index) { // your data saved in multi list as Post model - Post currentPost = post.multi[index]; + Post currentPost = post.multi![index]; return ListTile( leading: Text(currentPost.id.toString()), - title: Text(currentPost.title), + title: Text(currentPost.title!), onTap: () => Navigator.of(context).push( MaterialPageRoute( builder: (BuildContext context) { @@ -109,12 +109,12 @@ class Details extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text(post.multi[index].title)), + appBar: AppBar(title: Text(post.multi![index].title!)), body: Center( child: ListTile( - leading: Text(post.multi[index].id.toString()), - title: Text(post.multi[index].title), - subtitle: Text(post.multi[index].body), + leading: Text(post.multi![index].id.toString()), + title: Text(post.multi![index].title!), + subtitle: Text(post.multi![index].body!), ), ), ); diff --git a/example/lib/Views/user_View.dart b/example/lib/Views/user_View.dart index a57c697..236a7f8 100755 --- a/example/lib/Views/user_View.dart +++ b/example/lib/Views/user_View.dart @@ -1,10 +1,13 @@ import 'package:example/Models/UserModel.dart'; +import 'package:example/Models/user/address.dart'; +import 'package:example/Models/user/company.dart'; +import 'package:example/Models/user/geo.dart'; import 'package:flutter/material.dart'; import 'package:mc/mc.dart'; class UserExample extends StatelessWidget { final User users = McController().add("users", User()); - UserExample({this.title}); + UserExample({required this.title}); final String title; @override Widget build(BuildContext context) { @@ -46,10 +49,10 @@ class UserExample extends StatelessWidget { // [2]-change data with fromJson method directly: - users.multi[0].fromJson({ - users.nameStr: "Mohammed CHAHBOUN 💙", - users.companyStr: newCompany.toJson(), - users.imageStr: + users.multi![0].fromJson({ + users.nameVar: "Mohammed CHAHBOUN 💙", + users.companyVar: newCompany.toJson(), + users.imageVar: "https://avatars.githubusercontent.com/u/69054810?s=400&u=89be3dbf1c40d543e1fe2f648068bd8e388325ff&v=4" }); // Call rebuild method required if data multi @@ -67,18 +70,18 @@ class UserExample extends StatelessWidget { mc.get('rq').getObjData("users", users, multi: true), // call api every 1 sec callType: CallType.callAsStream, - secondsOfStream: 1, + secondsOfStream: 1, // your model model: users, // your widget for show data from model builder: (context) { return ListView.builder( - itemCount: users.multi.length, + itemCount: users.multi!.length, itemBuilder: (BuildContext context, int index) { - User user = users.multi[index]; - Company company = user.company; - Address address = user.address; - Geo geo = address.geo; + User user = users.multi![index]; + Company company = user.company!; + Address address = user.address!; + Geo geo = address.geo!; return ExpansionTile( leading: InkWell( onLongPress: () => users.delItem(index), @@ -90,31 +93,30 @@ class UserExample extends StatelessWidget { backgroundColor: Theme.of(context).primaryColor, backgroundImage: user.image == null ? null - : NetworkImage(user.image), + : NetworkImage(user.image!), child: user.image == null ? Icon(Icons.person) : null, ), ), - title: Text("User :" + user.name), + title: Text("User :" + user.name!), children: [ SizedBox(height: 5.0), Text(user.id.toString()), - Text(user.username), - Text(user.email), - Text(user.phone), - Text(user.website), + Text(user.username!), + Text(user.email!), + Text(user.phone!), + Text(user.website!), SizedBox(height: 5), - ExpansionTile( tilePadding: EdgeInsets.symmetric(horizontal: 40.0), leading: CircleAvatar( backgroundColor: Theme.of(context).primaryColor, child: Icon(Icons.home), ), - title: Text("Company :" + company.name), + title: Text("Company :" + company.name!), children: [ SizedBox(height: 5.0), - Text(company.bs), - Text(company.catchPhrase), + Text(company.bs!), + Text(company.catchPhrase!), ]), SizedBox(height: 5), ExpansionTile( @@ -123,13 +125,13 @@ class UserExample extends StatelessWidget { backgroundColor: Theme.of(context).primaryColor, child: Icon(Icons.place), ), - title: Text("Address :" + address.city), + title: Text("Address :" + address.city!), children: [ SizedBox(height: 5.0), - Text(address.street), - Text(address.suite), - Text(address.zipcode), - Text(address.city), + Text(address.street!), + Text(address.suite!), + Text(address.zipcode!), + Text(address.city!), SizedBox(height: 5.0), ExpansionTile( tilePadding: @@ -142,8 +144,8 @@ class UserExample extends StatelessWidget { title: Text("geo adrdress"), children: [ SizedBox(height: 5.0), - Text(geo.lat), - Text(geo.lng), + Text(geo.lat!), + Text(geo.lng!), ]), ]), ]); @@ -158,15 +160,15 @@ class UserExample extends StatelessWidget { // ignore: must_be_immutable class OneUser extends StatelessWidget { final int index; - User user; - Company company; - Address address; - Geo geo; + late User user; + late Company company; + late Address address; + late Geo geo; OneUser(this.index) { - user = mc.get('users').multi[index]; - company = user.company; - address = user.address; - geo = address.geo; + user = mc.get('users').multi![index]; + company = user.company!; + address = user.address!; + geo = address.geo!; } @override @@ -177,17 +179,17 @@ class OneUser extends StatelessWidget { leading: CircleAvatar( backgroundColor: Theme.of(context).primaryColor, backgroundImage: - user.image == null ? null : NetworkImage(user.image), + user.image == null ? null : NetworkImage(user.image!), child: user.image == null ? Icon(Icons.person) : null, ), - title: Text("User :" + user.name), + title: Text("User :" + user.name!), children: [ SizedBox(height: 5.0), Text(user.id.toString()), - Text(user.username), - Text(user.email), - Text(user.phone), - Text(user.website), + Text(user.username!), + Text(user.email!), + Text(user.phone!), + Text(user.website!), SizedBox(height: 5), ExpansionTile( tilePadding: EdgeInsets.symmetric(horizontal: 40.0), @@ -195,11 +197,11 @@ class OneUser extends StatelessWidget { backgroundColor: Theme.of(context).primaryColor, child: Icon(Icons.home), ), - title: Text("Company :" + company.name), + title: Text("Company :" + company.name!), children: [ SizedBox(height: 5.0), - Text(company.bs), - Text(company.catchPhrase), + Text(company.bs!), + Text(company.catchPhrase!), ]), SizedBox(height: 5), ExpansionTile( @@ -208,13 +210,13 @@ class OneUser extends StatelessWidget { backgroundColor: Theme.of(context).primaryColor, child: Icon(Icons.place), ), - title: Text("Address :" + address.city), + title: Text("Address :" + address.city!), children: [ SizedBox(height: 5.0), - Text(address.street), - Text(address.suite), - Text(address.zipcode), - Text(address.city), + Text(address.street!), + Text(address.suite!), + Text(address.zipcode!), + Text(address.city!), SizedBox(height: 5.0), ExpansionTile( tilePadding: EdgeInsets.symmetric(horizontal: 80.0), @@ -225,8 +227,8 @@ class OneUser extends StatelessWidget { title: Text("geo adrdress"), children: [ SizedBox(height: 5.0), - Text(geo.lat), - Text(geo.lng), + Text(geo.lat!), + Text(geo.lng!), ]), ]), ]), diff --git a/example/lib/main.dart b/example/lib/main.dart index a3bc566..da962f0 100755 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -44,7 +44,7 @@ class App extends StatelessWidget { // ignore: must_be_immutable class MyApp extends StatelessWidget { final ValueNotifier dx = ValueNotifier(0.1); - BuildContext cntx; + late BuildContext cntx; final List exps = [ "Mc Package", "Link your app with API easily", @@ -95,7 +95,7 @@ class MyApp extends StatelessWidget { exps[index], style: Theme.of(context) .textTheme - .headline5 + .headline5! .copyWith(fontWeight: FontWeight.bold), ), ); diff --git a/example/pubspec.lock b/example/pubspec.lock index 3da42ae..4e57c32 100755 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -73,7 +73,7 @@ packages: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.13.3" + version: "0.13.4" http_parser: dependency: transitive description: @@ -91,9 +91,9 @@ packages: mc: dependency: "direct main" description: - path: "/home/chahboun/mc" - relative: false - source: path + name: mc + url: "https://pub.dartlang.org" + source: hosted version: "0.0.2+1" meta: dependency: transitive @@ -109,13 +109,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.0" sky_engine: dependency: transitive description: flutter @@ -178,5 +171,5 @@ packages: source: hosted version: "2.1.0" sdks: - dart: ">=2.12.0 <3.0.0" + dart: ">=2.14.0 <3.0.0" flutter: ">=1.17.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index f0d44cc..ab6cdf3 100755 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+2 environment: - sdk: ">=2.7.0 <3.0.0" + sdk: '>=2.12.0 <3.0.0' dependencies: flutter: @@ -28,8 +28,9 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.0 - mc: - path: /home/chahboun/mc + + mc: ^0.0.2+1 + dev_dependencies: From 95b3aea85db67546a946d99c8ad231c757b680c9 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Sun, 2 Jan 2022 18:31:43 +0100 Subject: [PATCH 05/17] use HashMap instead of Map and add hasKey extension --- lib/src/mc_controller.dart | 22 ++++++++++++++-------- lib/src/mc_extensions.dart | 10 ++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lib/src/mc_controller.dart b/lib/src/mc_controller.dart index 8e259a0..e90924c 100644 --- a/lib/src/mc_controller.dart +++ b/lib/src/mc_controller.dart @@ -1,38 +1,44 @@ +import 'dart:collection'; +import 'mc_extensions.dart'; import 'package:mc/src/mc_model.dart'; /// حاص بتخزين النماذج المستحدمة و الحفاظ على البياتات class McController { static final McController _controller = McController._internal(); - Map models = {}; + HashMap _models = HashMap(); /// اضافة تموذج جديد T add(String key, T model, {bool readOnly = false}) { if (readOnly) { - if (!models.containsKey(key)) { - models[key] = model; + if (!_models.containsKey(key)) { + _models[key] = model; return model; } else { - return models[key]; + return _models[key]; } } else { - models[key] = model; + _models[key] = model; return model; } } /// الوصول لنموذج T get(String key) { - return models[key]; + return _models[key]; } /// حذف النموذح void remove(String key) { - models.remove(key); + _models.remove(key); + } + + bool hasKey(String key) { + return _models.hasKey(key); } // حذف نموذج بشرط معين void removeWhere(bool Function(String, dynamic) test) { - models.removeWhere(test); + _models.removeWhere(test); } factory McController([String? key, McModel? model]) { diff --git a/lib/src/mc_extensions.dart b/lib/src/mc_extensions.dart index b2d54f1..70e9b23 100644 --- a/lib/src/mc_extensions.dart +++ b/lib/src/mc_extensions.dart @@ -24,3 +24,13 @@ extension CustomLinkedList on LinkedList> { }); } } + +extension HasKey on HashMap { + bool hasKey(String key) { + bool checker = false; + this.forEach((_key, value) { + if (key == _key) checker = true; + }); + return checker; + } +} From 017cb9128f053bfb8ebe5c841823d7ba4e2c49a6 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Sun, 2 Jan 2022 18:37:44 +0100 Subject: [PATCH 06/17] add models keys --- lib/src/mc_controller.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/src/mc_controller.dart b/lib/src/mc_controller.dart index 653c78f..0882edf 100644 --- a/lib/src/mc_controller.dart +++ b/lib/src/mc_controller.dart @@ -35,6 +35,10 @@ class McController { return _models.hasKey(key); } + List keys() { + return _models.keys.toList(); + } + // حذف نموذج بشرط معين void removeWhere(bool Function(String, dynamic) test) { _models.removeWhere(test); From 675d8cdc6cbcd9939d1229fe8ef7502eb7f3f352 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Sun, 2 Jan 2022 18:39:36 +0100 Subject: [PATCH 07/17] convert keys method to getter --- lib/src/mc_controller.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/src/mc_controller.dart b/lib/src/mc_controller.dart index 0882edf..283e128 100644 --- a/lib/src/mc_controller.dart +++ b/lib/src/mc_controller.dart @@ -35,9 +35,7 @@ class McController { return _models.hasKey(key); } - List keys() { - return _models.keys.toList(); - } + List get keys => _models.keys.toList(); // حذف نموذج بشرط معين void removeWhere(bool Function(String, dynamic) test) { From 0fdacaff4d699016285534dc8425077a54aba4a1 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Sun, 2 Jan 2022 19:45:37 +0100 Subject: [PATCH 08/17] =?UTF-8?q?add=20toScreenSize=20extension=20=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/lib/Models/user/company.dart | 1 - lib/src/mc_constants.dart | 8 ++++++++ lib/src/mc_exception.dart | 6 +++++- lib/src/mc_extensions.dart | 10 ++++++++++ lib/src/mc_mini_view.dart | 18 +++++++++--------- lib/src/mc_model.dart | 13 ++++++------- lib/src/mc_value_listenable.dart | 4 ++-- lib/src/mc_view.dart | 9 +++++---- 8 files changed, 45 insertions(+), 24 deletions(-) create mode 100644 lib/src/mc_constants.dart diff --git a/example/lib/Models/user/company.dart b/example/lib/Models/user/company.dart index b62a5f5..c06966d 100644 --- a/example/lib/Models/user/company.dart +++ b/example/lib/Models/user/company.dart @@ -33,7 +33,6 @@ class Company extends McModel { } void setMulti(List data) { - List listOfcompany = data.map((e) { Company company = Company(); company.fromJson(e); diff --git a/lib/src/mc_constants.dart b/lib/src/mc_constants.dart new file mode 100644 index 0000000..e7f71ff --- /dev/null +++ b/lib/src/mc_constants.dart @@ -0,0 +1,8 @@ +const String heightScreen = "heightScreen"; +const String heightDesign = "heightDesign"; +const String widthScreen = "widthScreen"; +const String widthDesign = "widthDesign"; + +const String miniRebuild = "MiniRebuild"; +const String mergesRebuild = "MergesRebuild"; +const String rebuild = "rebuild"; diff --git a/lib/src/mc_exception.dart b/lib/src/mc_exception.dart index 6e9a6f4..fdfe4c9 100644 --- a/lib/src/mc_exception.dart +++ b/lib/src/mc_exception.dart @@ -1,5 +1,9 @@ class McException { - McException({this.response="", this.statusCode=0,this.exception="",this.stackTrace=StackTrace.empty}); + McException( + {this.response = "", + this.statusCode = 0, + this.exception = "", + this.stackTrace = StackTrace.empty}); final String response; final int statusCode; final String exception; diff --git a/lib/src/mc_extensions.dart b/lib/src/mc_extensions.dart index e174e1a..2f07cdf 100644 --- a/lib/src/mc_extensions.dart +++ b/lib/src/mc_extensions.dart @@ -1,6 +1,7 @@ import 'dart:collection'; import 'dart:ui'; import 'package:mc/src/mc_controller.dart'; +import 'mc_constants.dart'; import 'mc_llistenable.dart'; /// Extensions helper @@ -35,3 +36,12 @@ extension HasKey on HashMap { return checker; } } + +extension toScreenSize on num { + double get h => + (McController().get(heightScreen) * this) / + McController().get(heightDesign); + double get w => + (McController().get(widthScreen) * this) / + McController().get(widthDesign); +} diff --git a/lib/src/mc_mini_view.dart b/lib/src/mc_mini_view.dart index 84779eb..ed510f8 100644 --- a/lib/src/mc_mini_view.dart +++ b/lib/src/mc_mini_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; +import 'mc_constants.dart'; import 'mc_llistenable.dart'; -import 'mc_value_listenable.dart'; class McMV extends StatefulWidget { final McListenable mcValue; @@ -21,10 +21,10 @@ class _McMVState extends State { super.initState(); if (widget.mcValue.isMerged) { widget.mcValue.merges.forEach((mcValue) { - mcValue.registerListener(McValue.mergesRebuild, _rebuildWidget); + mcValue.registerListener(mergesRebuild, _rebuildWidget); }); } else { - widget.mcValue.registerListener(McValue.miniRebuild, _rebuildWidget); + widget.mcValue.registerListener(miniRebuild, _rebuildWidget); } } @@ -34,16 +34,16 @@ class _McMVState extends State { if (widget.mcValue.isMerged) { if (widget.mcValue != oldWidget.mcValue) { oldWidget.mcValue.merges.forEach((mcValue) { - mcValue.removeListener(McValue.mergesRebuild, _rebuildWidget); + mcValue.removeListener(mergesRebuild, _rebuildWidget); }); widget.mcValue.merges.forEach((mcValue) { - mcValue.registerListener(McValue.mergesRebuild, _rebuildWidget); + mcValue.registerListener(mergesRebuild, _rebuildWidget); }); } } else { if (widget.mcValue != oldWidget.mcValue) { - oldWidget.mcValue.removeListener(McValue.miniRebuild, _rebuildWidget); - widget.mcValue.registerListener(McValue.miniRebuild, _rebuildWidget); + oldWidget.mcValue.removeListener(miniRebuild, _rebuildWidget); + widget.mcValue.registerListener(miniRebuild, _rebuildWidget); } } } @@ -52,10 +52,10 @@ class _McMVState extends State { void dispose() { if (widget.mcValue.isMerged) { widget.mcValue.merges.forEach((mcValue) { - mcValue.removeListener(McValue.mergesRebuild, _rebuildWidget); + mcValue.removeListener(mergesRebuild, _rebuildWidget); }); } else { - widget.mcValue.removeListener(McValue.miniRebuild, _rebuildWidget); + widget.mcValue.removeListener(miniRebuild, _rebuildWidget); } super.dispose(); } diff --git a/lib/src/mc_model.dart b/lib/src/mc_model.dart index 9f3579a..91a8a67 100644 --- a/lib/src/mc_model.dart +++ b/lib/src/mc_model.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'mc_constants.dart'; import 'mc_exception.dart'; import 'mc_llistenable.dart'; @@ -10,7 +11,6 @@ abstract class McModel extends McListenable { bool failed = false; bool existData = false; McException exception = McException(); - static final String rebuild = "rebuild"; /// تفعيل و الغاء جاري التحميل void load(bool t) { @@ -19,7 +19,7 @@ abstract class McModel extends McListenable { } /// التقاط الخطأ - void setException( McException _response) { + void setException(McException _response) { exception = _response; callListener(rebuild); } @@ -33,13 +33,13 @@ abstract class McModel extends McListenable { return super.hasListeners; } - ///في حالة وجود خطأ + ///في حالة وجود خط أ void setFailed(bool state) { failed = state; callListener(rebuild); } - ///حذف النموذج من قائمة النماذج + /// حذف النموذج من قائمة النماذج void delItem(int index) { multi!.removeAt(index); callListener(rebuild); @@ -55,12 +55,12 @@ abstract class McModel extends McListenable { callListener(rebuild); } - ///json من النماذج الى بيانات + /// json من النماذج الى بيانات Map toJson() { return {}; } - ///التحكم في اعادة البناء يدويا + /// التحكم في اعادة البناء يدويا void rebuildWidget() { callListener(rebuild); } @@ -72,4 +72,3 @@ abstract class McModel extends McListenable { super.registerListener(key, listener); } } - diff --git a/lib/src/mc_value_listenable.dart b/lib/src/mc_value_listenable.dart index 3419234..d89b3ee 100644 --- a/lib/src/mc_value_listenable.dart +++ b/lib/src/mc_value_listenable.dart @@ -1,12 +1,12 @@ import 'dart:ui'; import 'package:mc/src/mc_llistenable.dart'; +import 'mc_constants.dart'; + class McValue extends McListenable { McValue(this._value); T get v => _value!; T? _value; - static final String miniRebuild = "MiniRebuild"; - static final String mergesRebuild = "MergesRebuild"; set v(T newValue) { if (_value == newValue) return; diff --git a/lib/src/mc_view.dart b/lib/src/mc_view.dart index dfced05..823fc4b 100644 --- a/lib/src/mc_view.dart +++ b/lib/src/mc_view.dart @@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mc/src/mc_model.dart'; +import 'mc_constants.dart'; import 'mc_exception.dart'; import 'mc_llistenable.dart'; @@ -132,7 +133,7 @@ class _McViewState extends State { widget.model.load(true); widget.call.call(); }; - widget.model.registerListener(McModel.rebuild, _handleChange); + widget.model.registerListener(rebuild, _handleChange); super.initState(); } @@ -140,14 +141,14 @@ class _McViewState extends State { void didUpdateWidget(McView oldWidget) { super.didUpdateWidget(oldWidget); if (widget.model != oldWidget.model) { - oldWidget.model.removeListener(McModel.rebuild); - widget.model.registerListener(McModel.rebuild, _handleChange); + oldWidget.model.removeListener(rebuild); + widget.model.registerListener(rebuild, _handleChange); } } @override void dispose() { - widget.model.removeListener(McModel.rebuild); + widget.model.removeListener(rebuild); super.dispose(); } From b5ec4c8f9130ecb10fa55ff427f95436c0566838 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Sun, 2 Jan 2022 19:45:37 +0100 Subject: [PATCH 09/17] =?UTF-8?q?add=20toScreenSize=20extension=20=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/lib/Models/user/company.dart | 1 - lib/mc.dart | 1 + lib/src/mc_constants.dart | 8 ++++++++ lib/src/mc_exception.dart | 6 +++++- lib/src/mc_extensions.dart | 10 ++++++++++ lib/src/mc_mini_view.dart | 18 +++++++++--------- lib/src/mc_model.dart | 13 ++++++------- lib/src/mc_value_listenable.dart | 4 ++-- lib/src/mc_view.dart | 9 +++++---- 9 files changed, 46 insertions(+), 24 deletions(-) create mode 100644 lib/src/mc_constants.dart diff --git a/example/lib/Models/user/company.dart b/example/lib/Models/user/company.dart index b62a5f5..c06966d 100644 --- a/example/lib/Models/user/company.dart +++ b/example/lib/Models/user/company.dart @@ -33,7 +33,6 @@ class Company extends McModel { } void setMulti(List data) { - List listOfcompany = data.map((e) { Company company = Company(); company.fromJson(e); diff --git a/lib/mc.dart b/lib/mc.dart index f1170f3..ae98e04 100755 --- a/lib/mc.dart +++ b/lib/mc.dart @@ -17,3 +17,4 @@ export 'src/mc_extensions.dart'; export 'src/mc_value_listenable.dart'; export 'src/mc_mini_view.dart'; export 'src/mc_exception.dart'; +export 'src/mc_constants.dart'; diff --git a/lib/src/mc_constants.dart b/lib/src/mc_constants.dart new file mode 100644 index 0000000..e7f71ff --- /dev/null +++ b/lib/src/mc_constants.dart @@ -0,0 +1,8 @@ +const String heightScreen = "heightScreen"; +const String heightDesign = "heightDesign"; +const String widthScreen = "widthScreen"; +const String widthDesign = "widthDesign"; + +const String miniRebuild = "MiniRebuild"; +const String mergesRebuild = "MergesRebuild"; +const String rebuild = "rebuild"; diff --git a/lib/src/mc_exception.dart b/lib/src/mc_exception.dart index 6e9a6f4..fdfe4c9 100644 --- a/lib/src/mc_exception.dart +++ b/lib/src/mc_exception.dart @@ -1,5 +1,9 @@ class McException { - McException({this.response="", this.statusCode=0,this.exception="",this.stackTrace=StackTrace.empty}); + McException( + {this.response = "", + this.statusCode = 0, + this.exception = "", + this.stackTrace = StackTrace.empty}); final String response; final int statusCode; final String exception; diff --git a/lib/src/mc_extensions.dart b/lib/src/mc_extensions.dart index e174e1a..2f07cdf 100644 --- a/lib/src/mc_extensions.dart +++ b/lib/src/mc_extensions.dart @@ -1,6 +1,7 @@ import 'dart:collection'; import 'dart:ui'; import 'package:mc/src/mc_controller.dart'; +import 'mc_constants.dart'; import 'mc_llistenable.dart'; /// Extensions helper @@ -35,3 +36,12 @@ extension HasKey on HashMap { return checker; } } + +extension toScreenSize on num { + double get h => + (McController().get(heightScreen) * this) / + McController().get(heightDesign); + double get w => + (McController().get(widthScreen) * this) / + McController().get(widthDesign); +} diff --git a/lib/src/mc_mini_view.dart b/lib/src/mc_mini_view.dart index 84779eb..ed510f8 100644 --- a/lib/src/mc_mini_view.dart +++ b/lib/src/mc_mini_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; +import 'mc_constants.dart'; import 'mc_llistenable.dart'; -import 'mc_value_listenable.dart'; class McMV extends StatefulWidget { final McListenable mcValue; @@ -21,10 +21,10 @@ class _McMVState extends State { super.initState(); if (widget.mcValue.isMerged) { widget.mcValue.merges.forEach((mcValue) { - mcValue.registerListener(McValue.mergesRebuild, _rebuildWidget); + mcValue.registerListener(mergesRebuild, _rebuildWidget); }); } else { - widget.mcValue.registerListener(McValue.miniRebuild, _rebuildWidget); + widget.mcValue.registerListener(miniRebuild, _rebuildWidget); } } @@ -34,16 +34,16 @@ class _McMVState extends State { if (widget.mcValue.isMerged) { if (widget.mcValue != oldWidget.mcValue) { oldWidget.mcValue.merges.forEach((mcValue) { - mcValue.removeListener(McValue.mergesRebuild, _rebuildWidget); + mcValue.removeListener(mergesRebuild, _rebuildWidget); }); widget.mcValue.merges.forEach((mcValue) { - mcValue.registerListener(McValue.mergesRebuild, _rebuildWidget); + mcValue.registerListener(mergesRebuild, _rebuildWidget); }); } } else { if (widget.mcValue != oldWidget.mcValue) { - oldWidget.mcValue.removeListener(McValue.miniRebuild, _rebuildWidget); - widget.mcValue.registerListener(McValue.miniRebuild, _rebuildWidget); + oldWidget.mcValue.removeListener(miniRebuild, _rebuildWidget); + widget.mcValue.registerListener(miniRebuild, _rebuildWidget); } } } @@ -52,10 +52,10 @@ class _McMVState extends State { void dispose() { if (widget.mcValue.isMerged) { widget.mcValue.merges.forEach((mcValue) { - mcValue.removeListener(McValue.mergesRebuild, _rebuildWidget); + mcValue.removeListener(mergesRebuild, _rebuildWidget); }); } else { - widget.mcValue.removeListener(McValue.miniRebuild, _rebuildWidget); + widget.mcValue.removeListener(miniRebuild, _rebuildWidget); } super.dispose(); } diff --git a/lib/src/mc_model.dart b/lib/src/mc_model.dart index 9f3579a..91a8a67 100644 --- a/lib/src/mc_model.dart +++ b/lib/src/mc_model.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'mc_constants.dart'; import 'mc_exception.dart'; import 'mc_llistenable.dart'; @@ -10,7 +11,6 @@ abstract class McModel extends McListenable { bool failed = false; bool existData = false; McException exception = McException(); - static final String rebuild = "rebuild"; /// تفعيل و الغاء جاري التحميل void load(bool t) { @@ -19,7 +19,7 @@ abstract class McModel extends McListenable { } /// التقاط الخطأ - void setException( McException _response) { + void setException(McException _response) { exception = _response; callListener(rebuild); } @@ -33,13 +33,13 @@ abstract class McModel extends McListenable { return super.hasListeners; } - ///في حالة وجود خطأ + ///في حالة وجود خط أ void setFailed(bool state) { failed = state; callListener(rebuild); } - ///حذف النموذج من قائمة النماذج + /// حذف النموذج من قائمة النماذج void delItem(int index) { multi!.removeAt(index); callListener(rebuild); @@ -55,12 +55,12 @@ abstract class McModel extends McListenable { callListener(rebuild); } - ///json من النماذج الى بيانات + /// json من النماذج الى بيانات Map toJson() { return {}; } - ///التحكم في اعادة البناء يدويا + /// التحكم في اعادة البناء يدويا void rebuildWidget() { callListener(rebuild); } @@ -72,4 +72,3 @@ abstract class McModel extends McListenable { super.registerListener(key, listener); } } - diff --git a/lib/src/mc_value_listenable.dart b/lib/src/mc_value_listenable.dart index 3419234..d89b3ee 100644 --- a/lib/src/mc_value_listenable.dart +++ b/lib/src/mc_value_listenable.dart @@ -1,12 +1,12 @@ import 'dart:ui'; import 'package:mc/src/mc_llistenable.dart'; +import 'mc_constants.dart'; + class McValue extends McListenable { McValue(this._value); T get v => _value!; T? _value; - static final String miniRebuild = "MiniRebuild"; - static final String mergesRebuild = "MergesRebuild"; set v(T newValue) { if (_value == newValue) return; diff --git a/lib/src/mc_view.dart b/lib/src/mc_view.dart index dfced05..823fc4b 100644 --- a/lib/src/mc_view.dart +++ b/lib/src/mc_view.dart @@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mc/src/mc_model.dart'; +import 'mc_constants.dart'; import 'mc_exception.dart'; import 'mc_llistenable.dart'; @@ -132,7 +133,7 @@ class _McViewState extends State { widget.model.load(true); widget.call.call(); }; - widget.model.registerListener(McModel.rebuild, _handleChange); + widget.model.registerListener(rebuild, _handleChange); super.initState(); } @@ -140,14 +141,14 @@ class _McViewState extends State { void didUpdateWidget(McView oldWidget) { super.didUpdateWidget(oldWidget); if (widget.model != oldWidget.model) { - oldWidget.model.removeListener(McModel.rebuild); - widget.model.registerListener(McModel.rebuild, _handleChange); + oldWidget.model.removeListener(rebuild); + widget.model.registerListener(rebuild, _handleChange); } } @override void dispose() { - widget.model.removeListener(McModel.rebuild); + widget.model.removeListener(rebuild); super.dispose(); } From 698b9fed11e7f8b2134b01f05ff684a92d67a33c Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Mon, 3 Jan 2022 14:29:17 +0100 Subject: [PATCH 10/17] add default value for onError [mc_request] --- lib/src/mc_request.dart | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/src/mc_request.dart b/lib/src/mc_request.dart index 35efd77..bc7b15c 100644 --- a/lib/src/mc_request.dart +++ b/lib/src/mc_request.dart @@ -141,6 +141,8 @@ class McRequest { } } + static _onError(Object e) => print(e); + @protected String _mapToString(Map mp) { String result = ""; @@ -168,7 +170,7 @@ class McRequest { Future getJsonData(String endpoint, {Map? params, bool complex = false, - Function(Object error)? onError, + Function(Object error) onError = _onError, Function(dynamic data)? inspect}) async { String srch = params != null ? _mapToString(params) : ""; Uri url = Uri.parse(this.url + "/" + endpoint + '?' + srch); @@ -176,7 +178,7 @@ class McRequest { http.Response response = await http.get(url, headers: headers); return _jsonData(response, inspect: inspect, endpoint: endpoint); } catch (e) { - onError!(e); + onError(e); } } @@ -268,14 +270,14 @@ class McRequest { Future putJsonData(int id, String endpoint, Map data, {Function(dynamic data)? inspect, - Function(Object error)? onError}) async { + Function(Object error) onError = _onError}) async { Uri url = Uri.parse(this.url + "/" + endpoint + "/" + id.toString() + "/"); try { http.Response response = await http.put(url, body: json.encode(data), headers: headers); return _jsonData(response, inspect: inspect, endpoint: endpoint); } catch (e) { - onError!(e); + onError(e); } } @@ -332,7 +334,7 @@ class McRequest { Future postJsonData(String endPoint, {Map? data, Function(dynamic data)? inspect, - Function(Object error)? onError, + Function(Object error) onError = _onError, Map? params}) async { String srch = params != null ? _mapToString(params) : ""; Uri url = Uri.parse(this.url + "/" + endPoint + "?" + srch); @@ -344,7 +346,7 @@ class McRequest { } return _jsonData(response, inspect: inspect, endpoint: endPoint); } catch (e) { - onError!(e); + onError(e); } } @@ -355,13 +357,13 @@ class McRequest { /// [inspect] => List /// Future delJsonData(int id, String endpoint, - {Function(Object error)? onError}) async { + {Function(Object error) onError = _onError}) async { Uri url = Uri.parse(this.url + "/" + endpoint + "/" + id.toString() + "/"); try { http.Response response = await http.delete(url, headers: headers); return response.body; } catch (e) { - onError!(e); + onError(e); } } From 4c1ab1031c36f7466df018ce4a22dd2e4f203009 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Mon, 3 Jan 2022 17:25:28 +0100 Subject: [PATCH 11/17] make loadin automatic for McView --- example/lib/Models/PhotoModel.dart | 13 ++++++++- example/lib/Models/PostModel.dart | 13 ++++++++- example/lib/Models/UserModel.dart | 42 +++++++++++++++++++---------- example/lib/Views/counter_View.dart | 12 ++++++--- example/lib/Views/mini_view.dart | 6 ++--- example/pubspec.lock | 6 ++--- example/pubspec.yaml | 3 ++- lib/src/mc_view.dart | 12 +++++---- 8 files changed, 75 insertions(+), 32 deletions(-) diff --git a/example/lib/Models/PhotoModel.dart b/example/lib/Models/PhotoModel.dart index 79944e3..bffd292 100755 --- a/example/lib/Models/PhotoModel.dart +++ b/example/lib/Models/PhotoModel.dart @@ -1,6 +1,7 @@ import 'package:mc/mc.dart'; class Photo extends McModel { + List? multi; int? albumId; int? id; String? title; @@ -19,7 +20,8 @@ class Photo extends McModel { this.url, this.thumbnailUrl, }); - fromJson(covariant Map json) { + + void fromJson(covariant Map json) { albumId = json['albumId'] ?? albumId; id = json['id'] ?? id; title = json['title'] ?? title; @@ -38,4 +40,13 @@ class Photo extends McModel { return data; } + + void setMulti(List data) { + List listOfphotos = data.map((e) { + Photo photos = Photo(); + photos.fromJson(e); + return photos; + }).toList(); + multi = listOfphotos; + } } diff --git a/example/lib/Models/PostModel.dart b/example/lib/Models/PostModel.dart index 8da965b..ffb0660 100755 --- a/example/lib/Models/PostModel.dart +++ b/example/lib/Models/PostModel.dart @@ -1,6 +1,7 @@ import 'package:mc/mc.dart'; class Post extends McModel { + List? multi; int? userId; int? id; String? title; @@ -16,7 +17,8 @@ class Post extends McModel { this.title, this.body, }); - fromJson(covariant Map json) { + + void fromJson(covariant Map json) { userId = json['userId'] ?? userId; id = json['id'] ?? id; title = json['title'] ?? title; @@ -33,4 +35,13 @@ class Post extends McModel { return data; } + + void setMulti(List data) { + List listOfpost = data.map((e) { + Post post = Post(); + post.fromJson(e); + return post; + }).toList(); + multi = listOfpost; + } } diff --git a/example/lib/Models/UserModel.dart b/example/lib/Models/UserModel.dart index de63e4b..6039edc 100755 --- a/example/lib/Models/UserModel.dart +++ b/example/lib/Models/UserModel.dart @@ -1,8 +1,10 @@ -import 'package:example/Models/user/address.dart'; -import 'package:example/Models/user/company.dart'; import 'package:mc/mc.dart'; +import 'user/address.dart'; +import 'user/company.dart'; + class User extends McModel { + List? multi; int? id; String? name; String? username; @@ -15,26 +17,28 @@ class User extends McModel { String idVar = "id"; String nameVar = "name"; - String imageVar = "image"; String usernameVar = "username"; String emailVar = "email"; String addressVar = "address"; String phoneVar = "phone"; String websiteVar = "website"; String companyVar = "company"; - User({ - this.id, - this.name, - this.username, - this.email, - this.address, - this.phone, - this.website, - this.company, - }) { + String imageVar = "image"; + + User( + {this.id, + this.name, + this.username, + this.email, + this.address, + this.phone, + this.website, + this.company, + this.image}) { address ??= Address(); company ??= Company(); } + void fromJson(covariant Map json) { id = json['id'] ?? id; name = json['name'] ?? name; @@ -43,6 +47,7 @@ class User extends McModel { address!.fromJson(json['address'] ?? address!.toJson()); phone = json['phone'] ?? phone; image = json['image'] ?? image; + website = json['website'] ?? website; company!.fromJson(json['company'] ?? company!.toJson()); return super.fromJson(json); @@ -53,13 +58,22 @@ class User extends McModel { data['id'] = this.id; data['name'] = this.name; data['username'] = this.username; - data['image'] = this.image; data['email'] = this.email; data['address'] = this.address!.toJson(); data['phone'] = this.phone; data['website'] = this.website; data['company'] = this.company!.toJson(); + data['image'] = this.image; return data; } + + void setMulti(List data) { + List listOfuser = data.map((e) { + User user = User(); + user.fromJson(e); + return user; + }).toList(); + multi = listOfuser; + } } diff --git a/example/lib/Views/counter_View.dart b/example/lib/Views/counter_View.dart index 2d4444c..1113cd2 100755 --- a/example/lib/Views/counter_View.dart +++ b/example/lib/Views/counter_View.dart @@ -25,10 +25,8 @@ class CounterExample extends StatelessWidget { McView( model: counter, // call & secondsOfStream & callType optional parameters you can use McView Widget without them - call: () { - counter.count += 1; - }, - callType: CallType.callAsStream, + call: add, + //callType: CallType.callAsStream, secondsOfStream: 1, builder: (context) { return Text( @@ -52,4 +50,10 @@ class CounterExample extends StatelessWidget { ), ); } + + Future add() async { + await Future.delayed(Duration(seconds: 2)); + counter.count += 50; + print(50); + } } diff --git a/example/lib/Views/mini_view.dart b/example/lib/Views/mini_view.dart index 67c9737..96d468d 100644 --- a/example/lib/Views/mini_view.dart +++ b/example/lib/Views/mini_view.dart @@ -67,14 +67,14 @@ class MiniView extends StatelessWidget { // dont use methods for add items or remove it use instead of it +/- mcList.v += [mcNum.v, mcString.v]; if (mcNum.v == 6) { - mcNum.registerListener(McValue.miniRebuild, valChanged); - mcNum.registerListener(McValue.mergesRebuild, () { + mcNum.registerListener(miniRebuild, valChanged); + mcNum.registerListener(mergesRebuild, () { print( 'this listener called when widget of merges values rebuild'); }); } if (mcNum.v == 12) { - mcNum.removeListener(McValue.miniRebuild, valChanged); + mcNum.removeListener(miniRebuild, valChanged); print("listener removed!!!"); } }, diff --git a/example/pubspec.lock b/example/pubspec.lock index 4e57c32..bb9b1f3 100755 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -91,9 +91,9 @@ packages: mc: dependency: "direct main" description: - name: mc - url: "https://pub.dartlang.org" - source: hosted + path: "/home/chahboun/mc" + relative: false + source: path version: "0.0.2+1" meta: dependency: transitive diff --git a/example/pubspec.yaml b/example/pubspec.yaml index ab6cdf3..d02dd05 100755 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -29,7 +29,8 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.0 - mc: ^0.0.2+1 + mc: + path: /home/chahboun/mc diff --git a/lib/src/mc_view.dart b/lib/src/mc_view.dart index 823fc4b..0e7ae84 100644 --- a/lib/src/mc_view.dart +++ b/lib/src/mc_view.dart @@ -56,7 +56,7 @@ class McView extends StatefulWidget { ///[CallType.callAsStream] /// ///[onError] - ///لبناء الواجهة الخاصة باظهار اي خطأ ويتم تمرير كائن يحمل الاخطأ التي حدثة + ///لبناء الواجهة الخاصة باظهار اي خطأ ويتم تمرير كائن يحمل الاخطأ التي حدثت /// McView({ @@ -69,21 +69,23 @@ class McView extends StatefulWidget { this.loader, this.onError, }) { + model.load(true); + /// call التحقق من طريقة الاستدعاء لدالة switch (callType) { case CallType.callAsFuture: - call(); + Future.value(call()).whenComplete(() => model.load(false)); break; case CallType.callIfModelEmpty: if (!model.existData) { - call(); + Future.value(call()).whenComplete(() => model.load(false)); } break; case CallType.callAsStream: - call(); + Future.value(call()).whenComplete(() => model.load(false)); Timer.periodic(Duration(seconds: secondsOfStream), (timer) { model.loadingChecking(true); - call(); + Future.value(call()).whenComplete(() => model.load(false)); if (!model.hasListener()) timer.cancel(); }); break; From bc6f689cfbae9f71a814b929f1c49aa3956205da Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Wed, 5 Jan 2022 22:39:16 +0100 Subject: [PATCH 12/17] use Size object instead of height an width double & add sizeScreen extension in BuildContext --- example/lib/Views/counter_View.dart | 3 +++ lib/src/mc_constants.dart | 6 ++---- lib/src/mc_extensions.dart | 31 ++++++++++++++++++++++------- lib/src/mc_mini_view.dart | 2 +- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/example/lib/Views/counter_View.dart b/example/lib/Views/counter_View.dart index 1113cd2..94451d3 100755 --- a/example/lib/Views/counter_View.dart +++ b/example/lib/Views/counter_View.dart @@ -8,11 +8,14 @@ class CounterExample extends StatelessWidget { final Counter counter = Counter(); @override Widget build(BuildContext context) { + // mc.add(sizeDesign, Size(100, 200)); + // mc.add(sizeScreen, Size(context.width, context.height)); return Scaffold( appBar: AppBar( title: Text(title), ), body: Container( + //width: 10.w, alignment: Alignment.center, padding: const EdgeInsets.symmetric(horizontal: 10.0), child: Column( diff --git a/lib/src/mc_constants.dart b/lib/src/mc_constants.dart index e7f71ff..b0f8c20 100644 --- a/lib/src/mc_constants.dart +++ b/lib/src/mc_constants.dart @@ -1,7 +1,5 @@ -const String heightScreen = "heightScreen"; -const String heightDesign = "heightDesign"; -const String widthScreen = "widthScreen"; -const String widthDesign = "widthDesign"; +const String sizeScreen = "sizeScreen"; +const String sizeDesign = "sizeDesign"; const String miniRebuild = "MiniRebuild"; const String mergesRebuild = "MergesRebuild"; diff --git a/lib/src/mc_extensions.dart b/lib/src/mc_extensions.dart index 2f07cdf..5947fa5 100644 --- a/lib/src/mc_extensions.dart +++ b/lib/src/mc_extensions.dart @@ -1,5 +1,6 @@ import 'dart:collection'; import 'dart:ui'; +import 'package:flutter/material.dart'; import 'package:mc/src/mc_controller.dart'; import 'mc_constants.dart'; import 'mc_llistenable.dart'; @@ -37,11 +38,27 @@ extension HasKey on HashMap { } } -extension toScreenSize on num { - double get h => - (McController().get(heightScreen) * this) / - McController().get(heightDesign); - double get w => - (McController().get(widthScreen) * this) / - McController().get(widthDesign); +extension ToScreenSize on num { + double get h { + assert(McController().get(sizeScreen) != null, + "you should define sizeScreen put this line in init of first widget\nmc.add(sizeDesign, Size(context.width,context.height));"); + assert(McController().get(sizeDesign) != null, + "you should define designScreen put this line in init of first widget\nmc.add(sizeDesign, Size(width of your design, height of your design));"); + return (McController().get(sizeScreen).height * this) / + McController().get(sizeDesign).height; + } + + double get w { + assert(McController().get(sizeScreen) != null, + "you should define sizeScreen put this line in init of first widget\nmc.add(sizeDesign, Size(context.width,context.height));"); + assert(McController().get(sizeDesign) != null, + "you should define designScreen put this line in init of first widget\nmc.add(sizeDesign, Size(width of your design, height of your design));"); + return (McController().get(sizeScreen).width * this) / + McController().get(sizeDesign).width; + } +} + +extension SizeScreen on BuildContext { + double get height => MediaQuery.of(this).size.height; + double get width => MediaQuery.of(this).size.width; } diff --git a/lib/src/mc_mini_view.dart b/lib/src/mc_mini_view.dart index ed510f8..58de6f5 100644 --- a/lib/src/mc_mini_view.dart +++ b/lib/src/mc_mini_view.dart @@ -67,7 +67,7 @@ class _McMVState extends State { } @override - Widget build(BuildContext context) { + Widget build(BuildContext context) { return widget.builder(); } } From 2109196e87d242d28dbfc0b3f33fefdd36640a50 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Thu, 6 Jan 2022 13:37:56 +0100 Subject: [PATCH 13/17] use log instead of print --- lib/src/mc_request.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/src/mc_request.dart b/lib/src/mc_request.dart index bc7b15c..326e2d9 100644 --- a/lib/src/mc_request.dart +++ b/lib/src/mc_request.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:mc/src/mc_model.dart'; @@ -65,12 +66,12 @@ class McRequest { _getDebugging(http.Response response, String? endpoint) { if (debugging) { - print("\x1B[38;5;2m ########## mc package ########## \x1B[0m"); - print("\x1B[38;5;2m [Url] => ${url + "/" + endpoint!} \x1B[0m"); - print("\x1B[38;5;2m [Response] => " + response.body + " \x1B[0m"); - print( + log("\x1B[38;5;2m ########## mc package ########## \x1B[0m"); + log("\x1B[38;5;2m [Url] => ${url + "/" + endpoint!} \x1B[0m"); + log("\x1B[38;5;2m [Response] => " + response.body + " \x1B[0m"); + log( "\x1B[38;5;2m [${response.statusCode}] => ${msgByStatusCode(response.statusCode)} \x1B[0m"); - print("\x1B[38;5;2m ################################ \x1B[0m"); + log("\x1B[38;5;2m ################################ \x1B[0m"); } } From 25fe62c91a4001d575481afad0f0fc2e01e69ed8 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Tue, 25 Jan 2022 16:11:17 +0100 Subject: [PATCH 14/17] optimized _objData method in McRequest & rename folders for dart style --- .../counter_model.dart} | 0 .../PhotoModel.dart => models/photo_model.dart} | 0 .../PostModel.dart => models/post_model.dart} | 0 .../lib/{Models => models}/user/address.dart | 0 .../lib/{Models => models}/user/company.dart | 0 example/lib/{Models => models}/user/geo.dart | 0 .../UserModel.dart => models/user_model.dart} | 0 example/lib/{Views => views}/counter_View.dart | 2 +- example/lib/{Views => views}/mini_view.dart | 0 example/lib/{Views => views}/photo_View.dart | 2 +- example/lib/{Views => views}/post_View.dart | 2 +- example/lib/{Views => views}/user_View.dart | 2 +- lib/src/mc_request.dart | 17 ++++++----------- 13 files changed, 10 insertions(+), 15 deletions(-) rename example/lib/{Models/CounterModel.dart => models/counter_model.dart} (100%) rename example/lib/{Models/PhotoModel.dart => models/photo_model.dart} (100%) rename example/lib/{Models/PostModel.dart => models/post_model.dart} (100%) rename example/lib/{Models => models}/user/address.dart (100%) rename example/lib/{Models => models}/user/company.dart (100%) rename example/lib/{Models => models}/user/geo.dart (100%) rename example/lib/{Models/UserModel.dart => models/user_model.dart} (100%) rename example/lib/{Views => views}/counter_View.dart (97%) rename example/lib/{Views => views}/mini_view.dart (100%) rename example/lib/{Views => views}/photo_View.dart (97%) rename example/lib/{Views => views}/post_View.dart (99%) rename example/lib/{Views => views}/user_View.dart (99%) diff --git a/example/lib/Models/CounterModel.dart b/example/lib/models/counter_model.dart similarity index 100% rename from example/lib/Models/CounterModel.dart rename to example/lib/models/counter_model.dart diff --git a/example/lib/Models/PhotoModel.dart b/example/lib/models/photo_model.dart similarity index 100% rename from example/lib/Models/PhotoModel.dart rename to example/lib/models/photo_model.dart diff --git a/example/lib/Models/PostModel.dart b/example/lib/models/post_model.dart similarity index 100% rename from example/lib/Models/PostModel.dart rename to example/lib/models/post_model.dart diff --git a/example/lib/Models/user/address.dart b/example/lib/models/user/address.dart similarity index 100% rename from example/lib/Models/user/address.dart rename to example/lib/models/user/address.dart diff --git a/example/lib/Models/user/company.dart b/example/lib/models/user/company.dart similarity index 100% rename from example/lib/Models/user/company.dart rename to example/lib/models/user/company.dart diff --git a/example/lib/Models/user/geo.dart b/example/lib/models/user/geo.dart similarity index 100% rename from example/lib/Models/user/geo.dart rename to example/lib/models/user/geo.dart diff --git a/example/lib/Models/UserModel.dart b/example/lib/models/user_model.dart similarity index 100% rename from example/lib/Models/UserModel.dart rename to example/lib/models/user_model.dart diff --git a/example/lib/Views/counter_View.dart b/example/lib/views/counter_View.dart similarity index 97% rename from example/lib/Views/counter_View.dart rename to example/lib/views/counter_View.dart index 94451d3..751c643 100755 --- a/example/lib/Views/counter_View.dart +++ b/example/lib/views/counter_View.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import '../Models/CounterModel.dart'; +import '../Models/counter_model.dart'; import 'package:mc/mc.dart'; class CounterExample extends StatelessWidget { diff --git a/example/lib/Views/mini_view.dart b/example/lib/views/mini_view.dart similarity index 100% rename from example/lib/Views/mini_view.dart rename to example/lib/views/mini_view.dart diff --git a/example/lib/Views/photo_View.dart b/example/lib/views/photo_View.dart similarity index 97% rename from example/lib/Views/photo_View.dart rename to example/lib/views/photo_View.dart index 7418e3b..6cc216f 100755 --- a/example/lib/Views/photo_View.dart +++ b/example/lib/views/photo_View.dart @@ -1,4 +1,4 @@ -import 'package:example/Models/PhotoModel.dart'; +import 'package:example/Models/photo_model.dart'; import 'package:flutter/material.dart'; import 'package:mc/mc.dart'; diff --git a/example/lib/Views/post_View.dart b/example/lib/views/post_View.dart similarity index 99% rename from example/lib/Views/post_View.dart rename to example/lib/views/post_View.dart index 4159edd..0411e33 100755 --- a/example/lib/Views/post_View.dart +++ b/example/lib/views/post_View.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mc/mc.dart'; -import '../Models/PostModel.dart'; +import '../Models/post_model.dart'; class PostExample extends StatelessWidget { // Save your model to use on another screen diff --git a/example/lib/Views/user_View.dart b/example/lib/views/user_View.dart similarity index 99% rename from example/lib/Views/user_View.dart rename to example/lib/views/user_View.dart index e9c9b05..bb6aabb 100755 --- a/example/lib/Views/user_View.dart +++ b/example/lib/views/user_View.dart @@ -1,4 +1,4 @@ -import 'package:example/Models/UserModel.dart'; +import 'package:example/Models/user_model.dart'; import 'package:example/Models/user/address.dart'; import 'package:example/Models/user/company.dart'; import 'package:example/Models/user/geo.dart'; diff --git a/lib/src/mc_request.dart b/lib/src/mc_request.dart index 326e2d9..1f543dd 100644 --- a/lib/src/mc_request.dart +++ b/lib/src/mc_request.dart @@ -69,8 +69,7 @@ class McRequest { log("\x1B[38;5;2m ########## mc package ########## \x1B[0m"); log("\x1B[38;5;2m [Url] => ${url + "/" + endpoint!} \x1B[0m"); log("\x1B[38;5;2m [Response] => " + response.body + " \x1B[0m"); - log( - "\x1B[38;5;2m [${response.statusCode}] => ${msgByStatusCode(response.statusCode)} \x1B[0m"); + log("\x1B[38;5;2m [${response.statusCode}] => ${msgByStatusCode(response.statusCode)} \x1B[0m"); log("\x1B[38;5;2m ################################ \x1B[0m"); } } @@ -118,22 +117,18 @@ class McRequest { if (multi!) { var result = json.decode(utf8.decode(response.bodyBytes)); if (inspect != null) { - result = inspect(result); - model.setMulti(result); - } else { - model.setMulti(result); + result = inspect(result ?? []); } + model.setMulti(result); + return model.multi; } else { var result = json.decode(utf8.decode(response.bodyBytes)); if (inspect != null) { result = inspect(result); - model.fromJson(result); - return model; - } else { - model.fromJson(result); - return model; } + model.fromJson(result); + return model; } } else { model.load(false); From 91ea11be09a0982d51f2b3a03098812c90d20515 Mon Sep 17 00:00:00 2001 From: M97chahboun Date: Tue, 25 Jan 2022 23:22:05 +0100 Subject: [PATCH 15/17] add requests folder in examples --- example/lib/main.dart | 10 +++++----- example/lib/requests/photo_request.dart | 8 ++++++++ example/lib/requests/post_request.dart | 23 ++++++++++++++++++++++ example/lib/requests/user_request.dart | 8 ++++++++ example/lib/views/counter_View.dart | 2 +- example/lib/views/photo_View.dart | 8 +++----- example/lib/views/post_View.dart | 26 +++++-------------------- example/lib/views/user_View.dart | 16 +++++++-------- example/pubspec.lock | 10 +++++----- 9 files changed, 66 insertions(+), 45 deletions(-) create mode 100644 example/lib/requests/photo_request.dart create mode 100644 example/lib/requests/post_request.dart create mode 100644 example/lib/requests/user_request.dart diff --git a/example/lib/main.dart b/example/lib/main.dart index 8a94943..cfd3553 100755 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,11 +1,11 @@ import 'dart:async'; +import 'package:example/views/counter_View.dart'; +import 'package:example/views/mini_view.dart'; +import 'package:example/views/photo_View.dart'; +import 'package:example/views/post_View.dart'; +import 'package:example/views/user_View.dart'; import 'package:flutter/material.dart'; import 'package:mc/mc.dart'; -import 'Views/counter_View.dart'; -import 'Views/mini_view.dart'; -import 'Views/photo_View.dart'; -import 'Views/post_View.dart'; -import 'Views/user_View.dart'; void main() { runApp(App()); diff --git a/example/lib/requests/photo_request.dart b/example/lib/requests/photo_request.dart new file mode 100644 index 0000000..7679cc2 --- /dev/null +++ b/example/lib/requests/photo_request.dart @@ -0,0 +1,8 @@ +import 'package:example/models/photo_model.dart'; +import 'package:mc/mc.dart'; + +class GetPhotos { + static Future getPhotos(Photo photo) => McController() + .get('rq') + .getObjData("photos", photo, multi: true); +} diff --git a/example/lib/requests/post_request.dart b/example/lib/requests/post_request.dart new file mode 100644 index 0000000..bf78645 --- /dev/null +++ b/example/lib/requests/post_request.dart @@ -0,0 +1,23 @@ +import 'package:example/models/post_model.dart'; +import 'package:mc/mc.dart'; + +class GetPosts { + static Future getPosts(Post post) => + McController().get('rq').getObjData( + // endpoint + "posts", + // your model + post, + inspect: (d) { + print(d); + return d; + }, + // if you received data as List multi will be true & if data as map you not should to define multi its false as default + multi: true, + // parameters for send it with request + // params:{"key":"value"}, + // inspect method for determine exact json use for generate your model in first step + // if your api send data directly without any supplement values you not should define it + // inspect:(data)=>data["response"] + ); +} diff --git a/example/lib/requests/user_request.dart b/example/lib/requests/user_request.dart new file mode 100644 index 0000000..7e72a58 --- /dev/null +++ b/example/lib/requests/user_request.dart @@ -0,0 +1,8 @@ +import 'package:example/models/user_model.dart'; +import 'package:mc/mc.dart'; + +class GetUsers { + static Future getUsers(User user) => McController() + .get('rq') + .getObjData("users", user, multi: true); +} diff --git a/example/lib/views/counter_View.dart b/example/lib/views/counter_View.dart index 751c643..c941917 100755 --- a/example/lib/views/counter_View.dart +++ b/example/lib/views/counter_View.dart @@ -1,5 +1,5 @@ +import 'package:example/models/counter_model.dart'; import 'package:flutter/material.dart'; -import '../Models/counter_model.dart'; import 'package:mc/mc.dart'; class CounterExample extends StatelessWidget { diff --git a/example/lib/views/photo_View.dart b/example/lib/views/photo_View.dart index 6cc216f..9bf0388 100755 --- a/example/lib/views/photo_View.dart +++ b/example/lib/views/photo_View.dart @@ -1,4 +1,5 @@ -import 'package:example/Models/photo_model.dart'; +import 'package:example/models/photo_model.dart'; +import 'package:example/requests/photo_request.dart'; import 'package:flutter/material.dart'; import 'package:mc/mc.dart'; @@ -18,9 +19,8 @@ class PhotoExample extends StatelessWidget { width: MediaQuery.of(context).size.width, child: McView( model: photo, - // get 5000 items - call: getData, + call: () => GetPhotos.getPhotos(photo), builder: (context) { return ListView.builder( itemCount: photo.multi!.length, @@ -56,6 +56,4 @@ class PhotoExample extends StatelessWidget { )), ); } - - Future getData() => request.getObjData("photos", photo, multi: true); } diff --git a/example/lib/views/post_View.dart b/example/lib/views/post_View.dart index 0411e33..5356c0b 100755 --- a/example/lib/views/post_View.dart +++ b/example/lib/views/post_View.dart @@ -1,6 +1,7 @@ +import 'package:example/models/post_model.dart'; +import 'package:example/requests/post_request.dart'; import 'package:flutter/material.dart'; import 'package:mc/mc.dart'; -import '../Models/post_model.dart'; class PostExample extends StatelessWidget { // Save your model to use on another screen @@ -23,7 +24,7 @@ class PostExample extends StatelessWidget { IconButton( icon: Icon(Icons.data_usage), // Refresh Data from Api - onPressed: () => refresh()) + onPressed: () => GetPosts.getPosts(post)) ], ), body: Container( @@ -31,11 +32,11 @@ class PostExample extends StatelessWidget { width: MediaQuery.of(context).size.width, child: RefreshIndicator( onRefresh: () { - return refresh(); + return GetPosts.getPosts(post); }, child: McView( // call api method - call: () => request.getObjData("posts", post, multi: true), + call: () => GetPosts.getPosts(post), // your model generated model: post, // handle errors @@ -82,23 +83,6 @@ class PostExample extends StatelessWidget { )), )); } - - Future refresh() { - // use hrrp method you want (get,post,put) + ObjData if you used model in McView and you can use JsonData for get data directly from api - return request.getObjData( - // endpoint - "posts", - // your model - post, - // if you received data as List multi will be true & if data as map you not should to define multi its false as default - multi: true, - // parameters for send it with request - // params:{"key":"value"}, - // inspect method for determine exact json use for generate your model in first step - // if your api send data directly without any supplement values you not should define it - // inspect:(data)=>data["response"] - ); - } } class Details extends StatelessWidget { diff --git a/example/lib/views/user_View.dart b/example/lib/views/user_View.dart index bb6aabb..9a3f77d 100755 --- a/example/lib/views/user_View.dart +++ b/example/lib/views/user_View.dart @@ -1,7 +1,8 @@ -import 'package:example/Models/user_model.dart'; -import 'package:example/Models/user/address.dart'; -import 'package:example/Models/user/company.dart'; -import 'package:example/Models/user/geo.dart'; +import 'package:example/models/user/address.dart'; +import 'package:example/models/user/company.dart'; +import 'package:example/models/user/geo.dart'; +import 'package:example/models/user_model.dart'; +import 'package:example/requests/user_request.dart'; import 'package:flutter/material.dart'; import 'package:mc/mc.dart'; @@ -66,12 +67,11 @@ class UserExample extends StatelessWidget { width: MediaQuery.of(context).size.width, child: McView( // call api by McRequest saved in McController and make model on ready - call: () => - mc.get('rq').getObjData("users", users, multi: true), + call: () => GetUsers.getUsers(users), // call api every 1 sec callType: CallType.callAsStream, - secondsOfStream: 1, - + // update data from server after 2 sec + secondsOfStream: 2, // your model model: users, // your widget for show data from model diff --git a/example/pubspec.lock b/example/pubspec.lock index bb9b1f3..2e2ca85 100755 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.1" + version: "2.8.2" boolean_selector: dependency: transitive description: @@ -21,7 +21,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -87,7 +87,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" mc: dependency: "direct main" description: @@ -155,7 +155,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.3" typed_data: dependency: transitive description: @@ -169,7 +169,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" sdks: dart: ">=2.14.0 <3.0.0" flutter: ">=1.17.0" From b53402e8500e08e3d766cea3835b2c4eb28def42 Mon Sep 17 00:00:00 2001 From: Mohammed CHAHBOUN Date: Tue, 8 Feb 2022 16:00:50 +0100 Subject: [PATCH 16/17] add const request key & endpoints on examples --- example/lib/main.dart | 2 +- example/lib/requests/photo_request.dart | 8 +++++--- example/lib/requests/post_request.dart | 10 ++++++---- example/lib/requests/user_request.dart | 8 +++++--- example/lib/views/photo_View.dart | 3 +-- example/lib/views/post_View.dart | 8 ++++---- example/lib/views/user_View.dart | 8 +++----- example/pubspec.lock | 2 +- example/pubspec.yaml | 2 +- lib/src/mc_constants.dart | 3 +++ lib/src/mc_extensions.dart | 1 - lib/src/mc_mini_view.dart | 2 +- pubspec.lock | 10 +++++----- 13 files changed, 36 insertions(+), 31 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index cfd3553..4cac88a 100755 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -59,7 +59,7 @@ class MyApp extends StatelessWidget { // create request object McRequest request = McRequest(url: baseUrl); // save it, for use it from any screen - mc.add('rq', request); + mc.add(mcRequestKey, request); Timer.periodic(Duration(milliseconds: 5), (timer) { if (dx.value <= MediaQuery.of(cntx).size.width + diff --git a/example/lib/requests/photo_request.dart b/example/lib/requests/photo_request.dart index 7679cc2..80d7ad3 100644 --- a/example/lib/requests/photo_request.dart +++ b/example/lib/requests/photo_request.dart @@ -1,8 +1,10 @@ import 'package:example/models/photo_model.dart'; import 'package:mc/mc.dart'; +const String photosEndpoint = "photos"; + class GetPhotos { - static Future getPhotos(Photo photo) => McController() - .get('rq') - .getObjData("photos", photo, multi: true); + static Future getPhotos(Photo photoModel) => McController() + .get(mcRequestKey) + .getObjData(photosEndpoint, photoModel, multi: true); } diff --git a/example/lib/requests/post_request.dart b/example/lib/requests/post_request.dart index bf78645..13c065c 100644 --- a/example/lib/requests/post_request.dart +++ b/example/lib/requests/post_request.dart @@ -1,13 +1,15 @@ import 'package:example/models/post_model.dart'; import 'package:mc/mc.dart'; +const String postsEndpoint = "posts"; + class GetPosts { - static Future getPosts(Post post) => - McController().get('rq').getObjData( + static Future getPosts(Post postModel) => + McController().get(mcRequestKey).getObjData( // endpoint - "posts", + postsEndpoint, // your model - post, + postModel, inspect: (d) { print(d); return d; diff --git a/example/lib/requests/user_request.dart b/example/lib/requests/user_request.dart index 7e72a58..91b7fb3 100644 --- a/example/lib/requests/user_request.dart +++ b/example/lib/requests/user_request.dart @@ -1,8 +1,10 @@ import 'package:example/models/user_model.dart'; import 'package:mc/mc.dart'; +const String usersEndpoint = "users"; + class GetUsers { - static Future getUsers(User user) => McController() - .get('rq') - .getObjData("users", user, multi: true); + static Future getUsers(User userModel) => McController() + .get(mcRequestKey) + .getObjData(usersEndpoint, userModel, multi: true); } diff --git a/example/lib/views/photo_View.dart b/example/lib/views/photo_View.dart index 9bf0388..1343d79 100755 --- a/example/lib/views/photo_View.dart +++ b/example/lib/views/photo_View.dart @@ -6,8 +6,7 @@ import 'package:mc/mc.dart'; class PhotoExample extends StatelessWidget { PhotoExample({required this.title}); final String title; - final Photo photo = McController().add('photos', Photo()); - final McRequest request = McController().get('rq'); + final Photo photo = McController().add(photosEndpoint, Photo()); @override Widget build(BuildContext context) { return Scaffold( diff --git a/example/lib/views/post_View.dart b/example/lib/views/post_View.dart index 5356c0b..a858965 100755 --- a/example/lib/views/post_View.dart +++ b/example/lib/views/post_View.dart @@ -7,9 +7,9 @@ class PostExample extends StatelessWidget { // Save your model to use on another screen // readOnly means if you close and open this screen you will use same data without update it from Api // [mc] is instance of Mccontroller injected in Object by extension for use it easily anywhere - final Post post = McController().add('posts', Post(), readOnly: true); - // get request by key - final McRequest request = McController().get("rq"); + final Post post = + McController().add(postsEndpoint, Post(), readOnly: true); + PostExample({required this.title}); final String title; @override @@ -88,7 +88,7 @@ class PostExample extends StatelessWidget { class Details extends StatelessWidget { final int index; //get your model by key - final Post post = McController().get('posts'); + final Post post = McController().get(postsEndpoint); Details(this.index); @override Widget build(BuildContext context) { diff --git a/example/lib/views/user_View.dart b/example/lib/views/user_View.dart index 9a3f77d..d4f36e3 100755 --- a/example/lib/views/user_View.dart +++ b/example/lib/views/user_View.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; import 'package:mc/mc.dart'; class UserExample extends StatelessWidget { - final User users = McController().add("users", User()); + final User users = McController().add(usersEndpoint, User()); UserExample({required this.title}); final String title; @override @@ -25,9 +25,7 @@ class UserExample extends StatelessWidget { child: Wrap( children: [Icon(Icons.get_app), Text("Get Data")], ), - onPressed: () => mc - .get('rq') - .getObjData("users", users, multi: true), + onPressed: () => GetUsers.getUsers(users), ), TextButton( child: Text( @@ -166,7 +164,7 @@ class OneUser extends StatelessWidget { late Address address; late Geo geo; OneUser(this.index) { - user = mc.get('users').multi![index]; + user = mc.get(usersEndpoint).multi![index]; company = user.company!; address = user.address!; geo = address.geo!; diff --git a/example/pubspec.lock b/example/pubspec.lock index 2e2ca85..5f21867 100755 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -91,7 +91,7 @@ packages: mc: dependency: "direct main" description: - path: "/home/chahboun/mc" + path: "/Users/mac/Developer/mc" relative: false source: path version: "0.0.2+1" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index d02dd05..8ff746e 100755 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -30,7 +30,7 @@ dependencies: cupertino_icons: ^1.0.0 mc: - path: /home/chahboun/mc + path: /Users/mac/Developer/mc diff --git a/lib/src/mc_constants.dart b/lib/src/mc_constants.dart index b0f8c20..7304b54 100644 --- a/lib/src/mc_constants.dart +++ b/lib/src/mc_constants.dart @@ -1,3 +1,6 @@ +// default key for McRequest object +const String mcRequestKey = "mcRequest"; + const String sizeScreen = "sizeScreen"; const String sizeDesign = "sizeDesign"; diff --git a/lib/src/mc_extensions.dart b/lib/src/mc_extensions.dart index 5947fa5..a3d3407 100644 --- a/lib/src/mc_extensions.dart +++ b/lib/src/mc_extensions.dart @@ -1,5 +1,4 @@ import 'dart:collection'; -import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:mc/src/mc_controller.dart'; import 'mc_constants.dart'; diff --git a/lib/src/mc_mini_view.dart b/lib/src/mc_mini_view.dart index 58de6f5..ed510f8 100644 --- a/lib/src/mc_mini_view.dart +++ b/lib/src/mc_mini_view.dart @@ -67,7 +67,7 @@ class _McMVState extends State { } @override - Widget build(BuildContext context) { + Widget build(BuildContext context) { return widget.builder(); } } diff --git a/pubspec.lock b/pubspec.lock index 0d3d37f..892df99 100755 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.1" + version: "2.8.2" boolean_selector: dependency: transitive description: @@ -21,7 +21,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -80,7 +80,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" meta: dependency: transitive description: @@ -141,7 +141,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.3" typed_data: dependency: transitive description: @@ -155,7 +155,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" sdks: dart: ">=2.14.0 <3.0.0" flutter: ">=1.17.0" From 5636c8990121eef84fa66812dc8c85b999873964 Mon Sep 17 00:00:00 2001 From: Mohammed CHAHBOUN Date: Sun, 20 Mar 2022 15:37:46 +0100 Subject: [PATCH 17/17] marked mc as discontinued package --- CHANGELOG.md | 14 ++++++++++++++ README.md | 3 ++- example/pubspec.lock | 9 ++++++++- pubspec.lock | 9 ++++++++- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2427885..e8bbf85 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,3 +49,17 @@ - removed [complex] parameter in [McRequest] methods - in [McView] passed on [onError] builder [McException] msg of error and reload method for use it for retry - removed unused parameter on [McView] Builder + +## [0.0.2+2] +- add default value for onError on [McRequest] methods +- make loading automatic on [McView] +- use [Size] object instead of height an width double & inject [sizeScreen] extension in [BuildContext] +- use [log] instead of [print] for debugging mode +- optimized [_objData] method in [McRequest] +- optimized examples structure +- use [HashMap] instead of Map & add [hasKey] extension on [HashMap] +- use [LinkedList] instead of [List] & add extensions needed +- add const keys for RocketController [mcRequestKey], [sizeScreenKey] & [sizeDesignKey] +- Rename package from [mc] to [MVCRocket] +- Marked [mc] as discontinued package +- Publish package with new name [MVCRocket] \ No newline at end of file diff --git a/README.md b/README.md index 3a117e1..2965352 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # mc State management and request package, Model,View,Controller,Request MVCR. +This package mark as discontinued you will found it with new name MVCRocket # Author: [Mohammed CHAHBOUN](https://github.com/m97chahboun) @@ -15,7 +16,7 @@ In your flutter project, add the dependency to your `pubspec.yaml` ```yaml dependencies: ... - mc: ^0.0.2+1 + mc: ^0.0.2+3 ``` # Usage ## Simple case use McMV & McValue diff --git a/example/pubspec.lock b/example/pubspec.lock index 5f21867..b25daaf 100755 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -88,6 +88,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.12.11" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" mc: dependency: "direct main" description: @@ -155,7 +162,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.8" typed_data: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index 892df99..62c20eb 100755 --- a/pubspec.lock +++ b/pubspec.lock @@ -81,6 +81,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.12.11" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" meta: dependency: transitive description: @@ -141,7 +148,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.8" typed_data: dependency: transitive description: