Expo กับ `OnActivityResult` Event

เมื่อไม่นานมานี้ได้ทดลองเขียน App บนมือถือโดยใช้ Expo ในการพัฒนา

ก่อนอื่นก็เกริ่นก่อนว่า Expo จริงๆแล้วก็คือ React-Native นั่นแหละ แต่เพียง Expo เป็น SDK ตัวหนึ่งที่ bundle library ต่างๆที่ทำให้เราไม่จำเป็นต้องไปโหลด dependency อื่นๆ หรือต้องมานั่งเขียน bridge ระหว่างตัว javascript กับ Android Native หรือ iOS Native (เอาจริงๆก็มีบ้างที่ต้องทำแบบนั้น)

ในกรณีที่ผมเขียนนั้นตัว Expo SDK เอง ไม่มี library ที่ตัวผมเองต้องการ จึงต้องทำการ detach project เพื่อเขียน bridge ระหว่างตัว Android Native กับ Expo

โดยปกติแล้วหากเขียน Component เพื่อดำเนินการ Login กับ 3rd Party ข้างนอกใน Android Native เพื่อให้ React-native สามารถใช้งานได้ ในตัว Component ก็ต้องมี method เพื่อรับสถานะการ Login หลังจากมีการ Login เสร็จสมบูรณ์นั้นก็คือ OnActivityResult นั่นเอง

แต่ปัญหาที่พบคือเจ้า Expo เนี่ยมันไม่ยิง Event เข้าตัวนี้เลยนี่สิ… งานเข้าแล้วเลยทำการ Debug Project ไปเรื่อยๆ จนได้เจอตัวนี้ `host.exp.exponent.ActivityResultListener`

วิธีการเขียนก็ง่ายๆครับ

[java]
private final host.exp.exponent.ActivityResultListener mActivityEventListener = new host.exp.exponent.ActivityResultListener() {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// some code here
}
};
[/java]

จากนั้นก็ Register เข้า constructor เป็นอันเสร็จสิ้น

[java]
public class Sample extends ReactContextBaseJavaModule {

private final host.exp.exponent.ActivityResultListener mActivityEventListener = new host.exp.exponent.ActivityResultListener() {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// some code here
}
};
public Sample(ReactApplicationContext reactContext) {
super(reactContext);
Exponent.getInstance().addActivityResultListener(mActivityEventListener);
}
}
[/java]

แค่นี้ก็สามารถใช้งาน OnActivitiyResult แบบเดิมได้แล้วครับ