Giter Site home page Giter Site logo

janishar / android-mvp-architecture Goto Github PK

View Code? Open in Web Editor NEW
4.4K 194.0 1.2K 6 MB

This repository contains a detailed sample app that implements MVP architecture using Dagger2, GreenDao, RxJava2, FastAndroidNetworking and PlaceholderView

Home Page: https://janisharali.com

License: Apache License 2.0

Java 98.33% FreeMarker 1.67%
mvp-architecture dagger2 rxjava fast-android-networking placeholderview greendao rxjava2 mvp dagger mindorks

android-mvp-architecture's Introduction

Deprecated


This Project is [Deprecated] goto latest project: Modern Android Development - WhereIsMyMotivation


Deprecated

Android MVP Architecture: Sample App

This repository contains a detailed sample app that implements MVP architecture using Dagger2, GreenDao, RxJava, FastAndroidNetworking, PlaceHolderView and AndroidDebugDatabase




Architecture Blueprint

Blueprint

Project Structure

Structure

About The Author

You can connect with me here:

Read the below listed articles. They describe the MVP concepts and the Project structure.

  1. MVP: Part 1
  2. MVP: Part 2
  3. MVP: Part 3
  4. Extension with Interactors and Repositories

The app has following packages:

  1. data: It contains all the data accessing and manipulating components.
  2. di: Dependency providing classes using Dagger2.
  3. ui: View classes along with their corresponding Presenters.
  4. service: Services for the application.
  5. utils: Utility classes.

Classes have been designed in such a way that it could be inherited and maximize the code reuse.

Library reference resources:

  1. Dagger2: https://github.com/janishar/android-dagger2-example
  2. PlaceHolderView: https://github.com/janishar/PlaceHolderView
  3. Calligraphy: https://github.com/chrisjenx/Calligraphy
  4. GreenDao: http://greenrobot.org/greendao/
  5. ButterKnife: http://jakewharton.github.io/butterknife/

Concept reference resources:

  1. Introduction to Dagger 2: Part 1
  2. Introduction to Dagger 2: Part 2
  3. Android Dagger2: Critical things to know before you implement
  4. Android Tinder Swipe View Example
  5. RxJava Anatomy: What is RxJava, how RxJava is designed, and how RxJava works.
  6. Powerful Android ORM: greenDAO 3 Tutorial

Looking for MVVM Architecture - Check here

Looking for Kotlin MVP Architecture - Check here

How do I use this project?

This is a boilerplate project aimed to help bootstrap new Android MVP Applications. Feel free to fork this application or use AndroidStarters to create new app using this boilerplate.

MVP template

When we follow any architecture pattern like MVP, MVVM, MVP clean, we always come across a small but repetitive task to create basic files like Android Activity, Presenter, View, Api models and then writing boiler plate code. This usually takes 1-2 hours for each single screen. To ease out work and save time We have created an automated template which will do above work in less than 20 seconds.

How to Install

Find the template/MVPActivity folder under root directory of android-mvp-architecture app. Paste the MVPActivity folder at below location.

  1. Windows - C:\Program Files\Android\Android Studio\plugins\android\lib\templates\activities
  2. Mac - /Applications/Android/Studio.app/Contents/plugins/android/lib/templates/activities

Restart the Android Studio.

Blueprint

How to use

Select the folder under which you want to create a new MVP folder. This MVP folder will contain Activity, Presenter, MVpPresenter and View class. For example, to create a new MVP folder under “view” folder, do as shown below.

Blueprint

License

   Copyright (C) 2023 JANISHAR ALI ANWAR

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

Contributing to Android MVP Architecture

All pull requests are welcome, make sure to follow the contribution guidelines when you submit pull request.

android-mvp-architecture's People

Contributors

abhi472 avatar amitshekhariitbhu avatar isatya avatar janishar avatar jkozh avatar jonathan-caryl avatar milkbiscuit avatar ravidsrk avatar ravikumar-n avatar sachinrana135 avatar thanhsontube avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-mvp-architecture's Issues

How to call a Method that located in Fragment from its Presenter?!

AboutMvpView:

Public interface AboutMvpView extends MvpView {
    void loadUserList();
}

AboutFragment:

public class AboutFragment extends BaseFragment implements AboutMvpView {
...
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_about, container, false);

        getActivityComponent().inject(this);

        setUnBinder(ButterKnife.bind(this, view));

        mPresenter.onAttach(this);

        mPresenter.onTest();//////////////////

        return view;
    }

    @Override
    public void loadUserList() {
        Toast.makeText(getActivity(),"onTest",Toast.LENGTH_LONG).show();
    }
}

AboutPresenter:

public class AboutPresenter<V extends AboutMvpView> extends BasePresenter<V>
        implements AboutMvpPresenter<V> {
    V mView;

    @Inject
    public AboutPresenter(DataManager dataManager, CompositeDisposable compositeDisposable) {
        super(dataManager, compositeDisposable);
        mView = getMvpView(); // What should we write here?!
    }

    @Override
    public void onTest() {
         mView.loadUserList(); //It's null!
/*java.lang.NullPointerException: Attempt to invoke interface method 'void com.mindorks.framework.mvp.ui.about.AboutMvpView.loadUserList()' on a null object reference*/
    }
}

Presenter cannot be provided without an @Provides- or @Produces-annotated method.

Great Work!!

I am getting this error,


Error:(32, 10) error: com.tv.goin.activities.login.LoginMvpPresenter<com.tv.goin.activities.login.LoginMvpView,com.tv.goin.activities.login.LoginMvpInteractor>  
 cannot be provided without an @Provides- or @Produces-annotated method.
com.tv.goin.activities.login.LoginMvpPresenter<com.tv.goin.activities.login.LoginMvpView,com.tv.goin.activities.login.LoginMvpInteractor> is injected at
com.tv.goin.activities.login.LoginActivity.mPresenter
com.tv.goin.activities.login.LoginActivity is injected at
com.tv.goin.di.component.ActivityComponent.inject(activity)

Why every XMvpPresenter has @PerActivity annotation ?

such as

@PerActivity
public interface SplashMvpPresenter<V extends SplashMvpView> extends MvpPresenter<V> {

}
@PerActivity
public interface MainMvpPresenter<V extends MainMvpView> extends MvpPresenter<V> {
}

I think it's unnecessary

Fix typo in readme

There is a small typo. "Kotlin" has been written as "Kotin" in the header that directs to the link to use Kotlin MVP architecture.

How to provide fragment ?

I have two ViewPager in App, in MainActivity and second in first fragment.
Both ViewPager implement like this https://github.com/MindorksOpenSource/android-mvp-architecture/blob/master/app/src/main/java/com/mindorks/framework/mvp/di/module/ActivityModule.java#L147

Now at start app it's shown error "FragmentManager is already executing transactions"
On Stackoverflow said "Simply Use childFragmentManger() for viewpager inside a Fragment", but here https://github.com/MindorksOpenSource/android-mvp-architecture/blob/master/app/src/main/java/com/mindorks/framework/mvp/di/module/ActivityModule.java#L148 using activity.

I'am new in DI, somebody can help provide fragment ?

Building app.

Currently if you try to run gradle build task you will get checkstyle violations and lint violations.
Maybe this should be fixed?

UnitTestingError

when I add the code blow to the LoginPresenterTest.java

@Test
public void testInvalidEmailLoginShouldShowError() {
        //invalid email address
        String email = "dummygmail.com";
        String password = "password";
        mLoginPresenter.onServerLoginClick(email, password);
        verify(mMockLoginMvpView).onError(R.string.invalid_email);
}

and run the test class LoginPresenterTest, then error occurred:

java.lang.ExceptionInInitializerError
	at io.reactivex.android.schedulers.AndroidSchedulers$1.call(AndroidSchedulers.java:35)
	at io.reactivex.android.schedulers.AndroidSchedulers$1.call(AndroidSchedulers.java:33)
	at io.reactivex.android.plugins.RxAndroidPlugins.callRequireNonNull(RxAndroidPlugins.java:70)
	at io.reactivex.android.plugins.RxAndroidPlugins.initMainThreadScheduler(RxAndroidPlugins.java:40)
	at io.reactivex.android.schedulers.AndroidSchedulers.<clinit>(AndroidSchedulers.java:32)
	at com.mindorks.framework.mvp.ui.login.LoginPresenter.onServerLoginClick(LoginPresenter.java:67)
	at com.mindorks.framework.mvp.ui.login.LoginPresenterTest.testServerLoginSuccess(LoginPresenterTest.java:82)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:68)
	at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:74)
	at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
	at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:161)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMainV2.main(AppMainV2.java:131)
Caused by: java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
	at android.os.Looper.getMainLooper(Looper.java)
	at io.reactivex.android.schedulers.AndroidSchedulers$MainHolder.<clinit>(AndroidSchedulers.java:29)
	... 41 more

How to mock for UI testing?

I'm really confused on how it should work. I'm studying this architecture and converting it to kotling, it seems even tho I can build successfully I cannot get a Mocked instance of API or Preferences helper, what I mean is that I'm trying to mock objects using mockito at ApplicationTestModule but its not replacing the real object from ApplicationModule, I wonder if there is something missing in the flow,... if RuleChain is properly setup in fact. I see the calls from TestComponentRule but

mTestComponent = DaggerTestComponent.builder() .applicationTestModule(ApplicationTestModule(app)) .build()

this is not working

Splash screen is not shown

When starting the app, the Splash Activity is called but I doesn't load the layout correctly as it shows a blank screen.

Global Navigation Drawer

Hey, is there a way to integrate the navigation drawer of the MainActivity into the BaseActivity to make the navigation drawer accessible in every activity?

how use database ?

please write a example about use greendao! Thanks! or where are you have use greendao on app.

CompositeDisposable dispose when detaching fragment

I'm attaching and detaching fragments, when i first add the fragment and call the presenter methods eveything works ok but after deataching and attaching again the compositeDisposable is disposed and doesn't execute anything. Any clue?

 switch (screenKey) {
                case Screens.STATUS_SCREEN:
                    fm.beginTransaction()
                            .detach(historyFragment)
                            .detach(profileFragment)
                            .attach(statusFragment)
                            .commitNow();
                    break;
                case Screens.HISTORY_SCREEN:
                    fm.beginTransaction()
                            .detach(profileFragment)
                            .detach(statusFragment)
                            .attach(historyFragment)
                            .commitNow();
                    break;
                case Screens.PROFILE_SCREEN:
                    fm.beginTransaction()
                            .detach(historyFragment)
                            .detach(statusFragment)
                            .attach(profileFragment)
                            .commitNow();
                    break;
            }

EDIT: I have a MainActivity which has an fragment_container that i change over bottonNavigationBar selection.

Presenter object is null

Hi Developer

I am using this framework since long time.

I am facing one issue, i am accessing the presenter object from different Fragment class via class instance, BUT i am always getting null value of that presenter.

Please suggest.

file missing

com.mindorks.framework.mvp.di.component.DaggerApplicationComponent
File are missing in this project

Manifest merger failed

Upon installing the relevant libraries and trying to build for the first time it displays this message:

Error:Execution failed for task ':app:processDebugManifest'.
Manifest merger failed : Attribute meta-data#android.support.VERSION@value value=(25.3.0) from [com.android.support:cardview-v7:25.3.0] AndroidManifest.xml:24:9-31
is also present at [com.android.support:recyclerview-v7:25.3.1] AndroidManifest.xml:24:9-31 value=(25.3.1).
Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:22:5-24:34 to override.

Upon adding to AndroidManifest.xml:

<meta-data tools:replace="android:value"/>

it displays:

Error:Execution failed for task ':app:processDebugManifest'.
Manifest merger failed with multiple errors, see logs

basedialog addition of fragments to backstack can be problematic

in basedialog where we are doing the fragment transaction, fragments are added to backstack
although it does seem harmless but in the cases where there is a repeated call to a same dialog(for eg. a network error dialog with retry option), same dialog is added to the backstack and even after transaction.remove() is applied the same dialog is reappearing.
By simply removing addtobackstack(null) we can save us from this problem,
anyhow i don't understand why do we need to retain a fragment after back press if we are handling removing similar dialogs anyway.
I solved my problem by removing addToBackStack(null)
i think this should also be applied in this repo too

Dagger 2.11 & Retrofit

Does this project follows the latest dagger 2 guidelines?

And is there any chance that you will include Retrofit API calls with proper separate network dagger module as shown here

How to use requestPermissionsSafely method?

I'm trying to understand this mvp pattern from your example i'm getting lot of from this so kindly help me to understand requestPermissionsSafely method available in BaseActivity.
What i'm trying to do is requesting for specific permissions from my view.

Retrofit with Progress Bars

This a very good example of MVP Architecture Pattern. Please add retrofit library implementation in this project. So that one can easily understand how to show a progress bar when data is loading and when to hide it.

Use getSchedulerProvider and getCompositeDisposable in services.

What is the way to use getCompositeDisposable and getSchedulerProvider in a service (For example SyncService)?

I have several services, one of them from Firebase (to update the user's push token) but I have to make an HTTP call from the service and I could not do it. I tried using dependency injection but I could not.

Update UI in Service?

Hi guys,
I'm a new guys trying to implement MVP with dependencies injection to new app.
I have a question about working with Service in MVP structure.
Is there a best way to update UI in a service in this architecture? (Ex : SyncService in this example).
Or I have to update through presenter? If i have to update through presenter, what should I do?

And how about Broadcast Receiver from system. Is there a best practice to do that also ?

Thank you so much!

File not found

You have used

import com.mindorks.framework.mvp.di.component.DaggerApplicationComponent;

in MvpApp but this file doesn't exist in project

mOpenSourceAdapter is null

https://github.com/MindorksOpenSource/android-mvp-architecture/blob/4191a3c325a2464811fdf4c3733731f54b4902a5/app/src/main/java/com/mindorks/framework/mvp/ui/feed/opensource/OpenSourceFragment.java#L100

Sometimes mOpenSourceAdapter is null and it hangs.

Reproduce the problem in an easy way:

1- Start an intent to youtube

Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(String.format("http://www.youtube.com/watch?v=%s", KEY))); intent.putExtra("force_fullscreen", true); itemView.getContext().startActivity(intent);

2- Press 4 times or more the button back before the video is opened

2.1 - The "onDestroyView" method is triggered when it does not have to.

3 - mOpenSourceAdapter is null and the application closes

I have tried to check if it is null and in the case that it is to start a new instance of OpenSourceAdapter but the application does not respond.

Is this normal?

Image load failure

the demo blog fragment,Image load failure,url need URLDecoder,then ok
but,some image Image load failure.
this is why?

Why Presenter and its related classes care created as Generic. But not view contract?

Hi, I have simple doubt with the presenter classes that are created in this project. I noted all the presenter classes (both classes & interfaces) are created as generic type classes. But view contract classes are not generic. Even though I created all the view contract classes generic it works fine. But fortunately I noted that view contract classes are not generic, Is there any specific reason for that?

Missing

DaggerApplicationComponent

Don't cast the ApplicationContext to your MvpApp

In your MvpApp class you cast the ApplicationContext to your MvpApp.

return (MvpApp) context.getApplicationContext();

This is wrong: see this SO Answer for details:

So if you want the Application class you registered in the Manifest, you should never call getApplicationContext() and cast it to your application, because it may not be the application instance (which you obviously experienced with the test framework).

Observer issues

Hi,
I have make server call after another server api call it return exception on second api response in same presenter.

Message-java.lang.NullPointerException: value == null

value == null

And My Code is

@OverRide
public void onServerLoginClick(String email, String password) {
//validate email and password
if (TextUtils.isEmpty(email)) {
getMvpView().onError(R.string.empty_email);
return;
}
if (!CommonUtils.isEmailValid(email)) {
getMvpView().onError(R.string.invalid_email);
return;
}
if (TextUtils.isEmpty(password)) {
getMvpView().onError(R.string.empty_password);
return;
}
getMvpView().showLoading();

    getDataManager().doServerLoginApiCall(email, "password", password)
            .subscribeOn(getSchedulerProvider().io())
            .observeOn(getSchedulerProvider().ui())
            .subscribe(new Consumer<LoginResponse>() {
                @Override
                public void accept(LoginResponse response) throws Exception {
                    if (response.getError() == null) {
                        getDataManager().updateUserCredential(
                                response.getAccessToken(),
                                DataManager.LoggedInMode.LOGGED_IN_MODE_LOGGED_OUT,
                                response.getRefreshToken(),
                                response.getTokenType());

                        **fetchUserDetails();**

                    } else {
                        getMvpView().onError(response.getError());
                    }

                    getMvpView().hideLoading();

                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    getMvpView().hideLoading();
                    // handle the login error here
                    handleApiError(throwable);

                }
            });
}

After this call I call metthod fetchUserDetails()

@OverRide
public void fetchUserDetails() {
getDataManager().doUserDetailsApiCall()
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(new Consumer() {
@OverRide
public void accept(UserDetailResponse response) throws Exception {

                    getMvpView().hideLoading();
                    getMvpView().openMainActivity();

                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    getMvpView().hideLoading();   **//Throw Exception here**
                    // handle the login error here
                    handleApiError(throwable);

                }
            });
}

Nested fragment navigation

Hi,
I want to open blog detail on fragment instead of web url inside my feed .how navigate fragment from BlogFragment.

GreenDao and HTTP same time

In the case of wanting to implement custom offline cache with GreenDao, Where should I do in DataManager or in the request in the presenter?

You could say how you would do it, please (no need code, just a short description, for example for getBlogApiCall() )

Another question I have is about the possibility of making multiple requests (single, ex: getBlogApiCall) at a time (when necessary) with zip. Is it a good practice?

Thanks for this repository and for the blog.

Navigation Drawer Not Reopen

I replaced the swipelayout with this

<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/main_content"> </RelativeLayout>

and then loaded AboutFragment inside main_content like so:

    @Override
    public void showAboutFragment() {
        getSupportFragmentManager()
            .beginTransaction()
            //.disallowAddToBackStack()
            .setCustomAnimations(R.anim.slide_left, R.anim.slide_right)
            .replace(R.id.main_content, AboutFragment.newInstance(), AboutFragment.TAG)
            .commit();
    }

The problem is when About nav drawer item is clicked and load about fragment, the nav drawer does not open again unless back arrow in About is clicked to remove AboutFragment

How can one be able to switch different fragment when respective nav drawer item is clicked?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.