用Dart&Henson玩轉Activity跳轉

用Dart&Henson玩轉Activity跳轉

Extra是Android標準的組件之間(Activity/Fragment/Service等)傳遞數據的方式。本文介紹了開源項目Dart的使用,它優雅的處理了組件間跳轉和數據傳遞java

內容提要

  • 傳統的方式
  • Dart & Henson
  • 小改進建議

本文中所演示的例子sample代碼位於DartHensonSampleandroid

傳統的方式

會Android的人都會這個的,這裏就簡單說下,通常流程是git

  1. 定好傳遞數據對應的Key
  2. SecondActivity設置好屬性,經過getIntent().getXXXExtra()得到數據
  3. FirstActivity經過intent.putExtra()設置數據,並執行startActivity()

具體這裏就不在貼上代碼了,主要講講這裏會致使的一些問題。github

  1. 首先這個Key要保持維護狀態,有時候先後兩個Activity不是同一個寫的,Key的使用交流會出現誤解或者指定錯誤
  2. SecondActivity中有些傳入的數據多是必須的,可是對於這個FirstActivity的做者可並不知道啊

好在Dart這個開源項目順利的處理了上述等問題,並且處理的很是優雅。app

Dart & Henson

Dart的原理和ButterKnife相似,都是經過註解處理器在編譯階段生成一些代碼。因此你再寫好一些註解後,必需要構建一些項目才能生成一些後面你所須要的代碼(後面會詳細說明)。maven

首先引入android-apt,在項目gradle中加入插件ide

buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}

再在build.gradle引用gradle

apply plugin: 'android-apt'

引入Dart & Henson(Henson實際是Dart項目的子項目)ui

compile 'com.f2prateek.dart:dart:2.0.0'
provided 'com.f2prateek.dart:dart-processor:2.0.0'
compile 'com.f2prateek.dart:henson:2.0.0'
provided 'com.f2prateek.dart:henson-processor:2.0.0'

這裏咱們假設要從MainActivity跳轉到DetailActivity,DetailActivity中要接受三個參數分別是String name,int ageUser user。這裏的user是一個自定義類型,咱們知道要想傳遞數據,必須序列化,文的例子中引入了Parceler項目經過一樣一個註解@Parcel自動在編譯器聲場Parcelable的繁雜的代碼:User.javathis

DetailActivity須要接受上述三個參數,僅僅經過@InjectExtra註解便可,而後在onCreate中執行Dart.inject(this),詳細的代碼爲:

public class DetailActivity extends AppCompatActivity {
    @InjectExtra
    String name = "default name";

    @InjectExtra
    int age = 0;

    @Nullable
    @InjectExtra
    User user;

    @BindView(R.id.tvName)
    TextView tvName;

    @BindView(R.id.tvAge)
    TextView tvAge;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        ButterKnife.bind(this);
        Dart.inject(this);
        initView();
    }

    private void initView() {
        // 使用name,age,user
    }
}

String name = "default name";這句話給了name一個默認值,可是當Dart.inject執行後會被傳遞過來的數據覆蓋。
@Nullable加在了user上說明這個數據能夠不用傳遞。接受端就這麼多代碼,下面讓咱們看看發送端若是發送數據,如何跳轉到DetailActivity。

注意編寫上述代碼後,咱們要先編譯下項目,編譯好後Henson會經過註解處理器生成能夠跳轉到DetailActivity的DSL(領域特定語言)段,方便其餘組件對DetailActivity的跳轉,咱們在MainActivity上只要寫上下列代碼,便可完成界面跳轉和數據傳遞:

User user = new User();
user.setAge(Integer.parseInt(age.getText().toString()));
user.setName(name.getText().toString());
startActivity(
        Henson.with(this)
                .gotoDetailActivity()
                .age(27)
                .name("jason")
                .user(user)
                .build()
);

當你寫完Henson.with(this)後代碼提示會自動彈出.gotoDetailActivity(),Henson幫助你提示你DetailActivity是能夠被跳轉的;隨後你繼續寫下.gotoDetailActivity()後,又自動彈出.age()方法,提示你傳入一個int類型給age,寫好後,又自動彈出.name()方法,以此類推,最後以一個build()收場。
注意,這裏你能夠不寫.user(),由於在DetailActivity中咱們指定它是nullable的,能夠不傳。可是.age().name()都是會強制彈出讓你填寫數據的。

至此,Henson&Dart的基本介紹結束。

小改進建議

Dart還有一個@HensonNavigable註解,它標註在將會被跳轉到的Activity的classname上,說明這個activity能夠被跳轉,會自動生成.gotoXXXActivity()這樣的代碼,可是它不能在這個類中存在@InjectExtra註解,這裏總以爲這個註解有些多餘。

第二,和Dart項目的做者提了issue問了關於參數指定的順序問題,上述例子中咱們傳遞數據的代碼是:

Henson.with(this)
       .gotoDetailActivity()
       .age(Integer.parseInt(age.getText().toString()))
       .name(name.getText().toString())
       .build()

可是若是我偏向要對調name和age呢?發現不行~若是你寫完.gotoDetailActivity()後發現只有.age()的提示,卻沒有.name()的,即強制要求你先傳遞age。這裏做者說明後才知道他們是按照字幕順序來排數據傳入的,目前沒有更好的方法。

歡迎你開心的使用Dart & Henson!

相關文章
相關標籤/搜索