flutter_addtoapp_bridge 0.0.5 copy "flutter_addtoapp_bridge: ^0.0.5" to clipboard
flutter_addtoapp_bridge: ^0.0.5 copied to clipboard

flutter addtoapp bridge for flutter call android/ios. so code in flutter page can open native page by this bridge.

flutter_addtoapp_bridge #

flutter addtoapp bridge for flutter call android/ios.

Usage(flutter call android/ios) #

flutter_addtoapp_bridge/versions

flutter_addtoapp_bridge: ^x.x.x
  • dart
class _MyAppState extends State<MyApp> {
  final _flutterAddtoappBridgePlugin = FlutterAddtoappBridge();

  Future<void> initPlatformState() async {
    try {
      dynamic result = await _flutterAddtoappBridgePlugin.open("toast", "Hi, I am from flutter!");
      if (kDebugMode) {
        print("putPlatformValue result=$result");
      }
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }
  }
}
  • ios(objectivec)

pod install

#import <flutter_addtoapp_bridge/FlutterAddtoappBridgePlugin.h>

// write code in application AppDelegate
[FlutterAddtoappBridgePlugin setOnGlobalMethodCall:^(UIViewController *topmostViewController, FlutterMethodCall *call, FlutterResult result) {
  NSLog(@"onCall topViewController=%@, method=%@, arguments=%@", topmostViewController, call.method, call.arguments);
  
  if([@"callPlatform" isEqualToString:call.method]){
      NSLog(@"onCall %@" ,[call.arguments class]);
      NSArray *argumentsWithFunctionNameArray = (NSArray *)call.arguments;
      NSString *functionName = [argumentsWithFunctionNameArray firstObject];
      if([@"getPlatformVersion" isEqualToString:functionName]){
          result([[UIDevice currentDevice] systemVersion]);
      }else if([@"open" isEqualToString:functionName]){
          NSArray *argumentsArray = (NSArray *)[argumentsWithFunctionNameArray objectAtIndex:1];
          NSString *url = [argumentsArray firstObject];
          NSLog(@"onCall open-> url==%@, arguments=%@", url, [argumentsArray objectAtIndex:1]);
          if([@"toast" isEqualToString:url]){
              [FlutterAddtoappBridgePlugin showToast:topmostViewController message:(NSString *)[argumentsArray objectAtIndex:1]];
              result(@"0");
          }else{
              result([NSString stringWithFormat:@"-2 %@ is not support", url]);
          }
      }else{
          result([NSString stringWithFormat:@"-1 %@ is not support", functionName]);
      }
      NSLog(@"onCall %lu" ,(unsigned long)[argumentsWithFunctionNameArray count]);
  }else{
      result(FlutterMethodNotImplemented);
  }
}];
  • android(kotlin)
import com.codesdancing.flutter.addtoapp.bridge.FlutterAddtoappBridgePlugin;

// write code in application
FlutterAddtoappBridgePlugin.setOnGlobalMethodCall(object : FlutterAddtoappBridgePlugin.OnGlobalMethodCall {
    override fun onCall(activity: Activity?, call: MethodCall, result: MethodChannel.Result) {
        Log.d("onCall", "activity=${activity?.hashCode()}, method=${call.method}, arguments=${call.arguments}")
        if (call.method == "callPlatform") {
            val argumentsWithFunctionNameArray = call.arguments as? ArrayList<*>
            when (val functionName = argumentsWithFunctionNameArray?.first()) {
                "getPlatformVersion" -> result.success(android.os.Build.VERSION.RELEASE)
                "open" -> {
                    val argumentsArray = argumentsWithFunctionNameArray.getOrNull(1) as? ArrayList<*>
                    Log.d("onCall", "open-> url=${argumentsArray?.getOrNull(0)}, arguments=${argumentsArray?.getOrNull(1) as? String ?: ""}}")
                    when (val url = argumentsArray?.getOrNull(0)) {
                        "toast" -> {
                            FlutterAddtoappBridgePlugin.showToast(activity, argumentsArray.getOrNull(1) as? String ?: "")
                            result.success("0")
                        }
                        else -> {
                            result.error("-2", "$url is not support", null)
                        }
                    }
                }
                else -> result.error("-1", "$functionName is not support", null)
            }
        } else {
            result.notImplemented()
        }
    }
})

shouldAttachEngineToActivity(true) // must be true, or flutter plugin activiy is null

the activity contains flutter fragment must special android:theme="@style/AppTheme", or render not completely

flutter fragment shouldn't in viewpager, render not completely, or maybe the problem is not special android:theme in activity

import io.flutter.embedding.android.FlutterFragment;

public class FlutterFragmentExampleActivity extends AppCompatActivity {
    @Nullable
    private FlutterFragment flutterFragment = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.flutter_fragment_example_activity);
        flutterFragment = FlutterFragment.withCachedEngine("my_engine_id")
                .shouldAttachEngineToActivity(true)
                .build();
        this.getSupportFragmentManager().beginTransaction()
                .add(R.id.flutterContainer, flutterFragment, "flutterFragment")
                .commitAllowingStateLoss();

//        new Handler().postDelayed(() -> {
//            this.getSupportFragmentManager().beginTransaction()
//                    .replace(android.R.id.content, new MineFragment(), "MineFragment")
//                    .commitAllowingStateLoss();
//            new Handler().postDelayed(() -> {
//                this.getSupportFragmentManager().beginTransaction()
//                        .add(android.R.id.content, flutterFragment, "flutterFragment")
//                        .commitAllowingStateLoss();
//            }, 3000);
//        }, 3000);
    }

    @Override
    public void onPostResume() {
        super.onPostResume();
        if (flutterFragment != null) flutterFragment.onPostResume();
    }

    @Override
    protected void onNewIntent(@NonNull Intent intent) {
        if (flutterFragment != null) flutterFragment.onNewIntent(intent);
    }

    @Override
    public void onBackPressed() {
        if (flutterFragment != null) flutterFragment.onBackPressed();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (flutterFragment != null) flutterFragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    public void onUserLeaveHint() {
        if (flutterFragment != null) flutterFragment.onUserLeaveHint();
    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (flutterFragment != null) flutterFragment.onTrimMemory(level);
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

    <FrameLayout android:id="@+id/flutterContainer" android:background="@color/yellow" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" />

    <TextView android:background="@color/orange" android:textSize="30sp" android:gravity="center" android:layout_width="match_parent" android:layout_height="100dp" android:text="bottom bar" />
</LinearLayout>

<activity android:name="xx.FlutterFragmentExampleActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:exported="true" android:hardwareAccelerated="true" android:launchMode="singleTop" android:theme="@style/AppTheme" android:windowSoftInputMode="adjustResize">
    <!-- This keeps the window background of the activity showing
         until Flutter renders its first frame. It can be removed if
         there is no splash screen (such as the default splash screen
         defined in @style/LaunchTheme). -->
    <meta-data android:name="io.flutter.app.android.SplashScreenUntilFirstFrame" android:value="true" />
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
0
likes
0
pub points
0%
popularity

Publisher

verified publishercodesdancing.com

flutter addtoapp bridge for flutter call android/ios. so code in flutter page can open native page by this bridge.

Repository (GitHub)
View/report issues

License

unknown (LICENSE)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on flutter_addtoapp_bridge