Flutter:是否可以通过 MethodChannel 将数据从 Android 模块发送到 Flutter 项目而不关闭 Activity(仍在 Android Activity 中)?
我有屏幕。
- 故事屏幕(来自颤音)
- 主动脉(来自Android活动,扩展到颤音)
- mainnitivitivity(从Android活动,扩展到AppCompatactivity)
实际屏幕仅为两个,storyscreen
mainnunityActivity
。 MainActivity
仅适用于主机。
在MainActivity
中,我们定义意图
和方法频道
。
class MainActivity : FlutterActivity() {
private val tag = "MAIN"
private val channel = "NATIVE_EXPERIMENT"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
MethodChannel(flutterEngine.dartExecutor, channel).setMethodCallHandler { call, result ->
if (call.method.equals("goToUnityActivity")) {
val arg = call.arguments as Map<String, Any>
val gameType = arg.getValue("gameType") as String
val catalogURL = arg.getValue("catalogURL") as String
goToUnityActivity(gameType, catalogURL)
result.success(null)
} else {
result.notImplemented()
}
}
}
private fun goToUnityActivity(gameType: String, catalogURL: String) {
val intent = Intent(this, MainUnityActivity::class.java)
intent.putExtra("gameType", gameType)
intent.putExtra("catalogURL", catalogURL)
startActivityForResult(intent, MainUnityActivity.REQUEST_CODE_FROM_UNITY)
}
private fun notifyFlutterBackFromUnity(data: String?) {
MethodChannel(flutterEngine?.dartExecutor, channel).invokeMethod("backFromUnity", data)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == MainUnityActivity.REQUEST_CODE_FROM_UNITY) {
if (resultCode == MainUnityActivity.RESULT_CODE_BACK_FROM_UNITY) {
val listOfReport = data!!.getStringExtra("listOfReport")
Log.i(tag, "/// [MainActivity] back from unity --> $listOfReport")
notifyFlutterBackFromUnity(listOfReport)
}
}
}
}
如果我从mainnityActivity
退出,我可以将数据从Android发送到颤音侧,但是如果我们仍在mainnityActivity
中,但是想从Android发送数据到Flutter sine?
class MainUnityActivity : UnityPlayerActivity() {
private val tag = "MIDDLEWARE_UNITY"
private val listOfVehicleNames: MutableList<String> = mutableListOf()
companion object {
const val RESULT_CODE_BACK_FROM_UNITY = 110
const val REQUEST_CODE_FROM_UNITY = 1
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
listOfVehicleNames.clear()
}
private fun backFromUnity() {
Log.i(tag, "/// [MainUnityActivity] BackButtonClick")
val resultIntent = Intent().apply {
putExtra("listOfReport", listOfVehicleNames.toString())
}
setResult(RESULT_CODE_BACK_FROM_UNITY, resultIntent)
finish()
}
override fun BackButtonClick() {
Log.i(tag, "/// [MainUnityActivity] BackButtonClick")
backFromUnity()
}
override fun ReportButtonClick() {
Log.i(tag, "/// [MainUnityActivity] ReportButtonClick")
showDialog()
}
private fun notifyFlutterReportFromUnity() {
val json = """{"title": "JSON Title", "notes": "JSON Notes"}"""
Log.i(tag, "/// [MainUnityActivity] YesReportClick :$json")
listOfVehicleNames.add(json)
// TODO: I want send data to Flutter without close this activity
}
private fun showDialog() {
val builder = AlertDialog.Builder(this)
builder.setTitle("Report")
builder.setMessage("Is there something wrong ?")
builder.setPositiveButton(
"Yes"
) { _, _ ->
Toast.makeText(this, "Okay, we're sorry", Toast.LENGTH_SHORT).show()
notifyFlutterReportFromUnity()
}
builder.setNegativeButton(
"No"
) { _, _ ->
// User click no
}
builder.setNeutralButton("Cancel") { _, _ ->
// User cancelled the dialog
}
builder.show()
}
}
I have screens.
- StoryScreen (from Flutter)
- MainActivity (from Android Activity, extend to FlutterActivity)
- MainUnityActivity (from Android Activity, extend to AppCompatActivity)
The actually screen is only two, StoryScreen
and MainUnityActivity
. MainActivity
only for host.
In MainActivity
we define intent
and method channel
.
class MainActivity : FlutterActivity() {
private val tag = "MAIN"
private val channel = "NATIVE_EXPERIMENT"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
MethodChannel(flutterEngine.dartExecutor, channel).setMethodCallHandler { call, result ->
if (call.method.equals("goToUnityActivity")) {
val arg = call.arguments as Map<String, Any>
val gameType = arg.getValue("gameType") as String
val catalogURL = arg.getValue("catalogURL") as String
goToUnityActivity(gameType, catalogURL)
result.success(null)
} else {
result.notImplemented()
}
}
}
private fun goToUnityActivity(gameType: String, catalogURL: String) {
val intent = Intent(this, MainUnityActivity::class.java)
intent.putExtra("gameType", gameType)
intent.putExtra("catalogURL", catalogURL)
startActivityForResult(intent, MainUnityActivity.REQUEST_CODE_FROM_UNITY)
}
private fun notifyFlutterBackFromUnity(data: String?) {
MethodChannel(flutterEngine?.dartExecutor, channel).invokeMethod("backFromUnity", data)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == MainUnityActivity.REQUEST_CODE_FROM_UNITY) {
if (resultCode == MainUnityActivity.RESULT_CODE_BACK_FROM_UNITY) {
val listOfReport = data!!.getStringExtra("listOfReport")
Log.i(tag, "/// [MainActivity] back from unity --> $listOfReport")
notifyFlutterBackFromUnity(listOfReport)
}
}
}
}
If I exit from MainUnityActivity
, I can send data from Android to Flutter side, but how if we still in MainUnityActivity
but want to send data from Android to Flutter side?
class MainUnityActivity : UnityPlayerActivity() {
private val tag = "MIDDLEWARE_UNITY"
private val listOfVehicleNames: MutableList<String> = mutableListOf()
companion object {
const val RESULT_CODE_BACK_FROM_UNITY = 110
const val REQUEST_CODE_FROM_UNITY = 1
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
listOfVehicleNames.clear()
}
private fun backFromUnity() {
Log.i(tag, "/// [MainUnityActivity] BackButtonClick")
val resultIntent = Intent().apply {
putExtra("listOfReport", listOfVehicleNames.toString())
}
setResult(RESULT_CODE_BACK_FROM_UNITY, resultIntent)
finish()
}
override fun BackButtonClick() {
Log.i(tag, "/// [MainUnityActivity] BackButtonClick")
backFromUnity()
}
override fun ReportButtonClick() {
Log.i(tag, "/// [MainUnityActivity] ReportButtonClick")
showDialog()
}
private fun notifyFlutterReportFromUnity() {
val json = """{"title": "JSON Title", "notes": "JSON Notes"}"""
Log.i(tag, "/// [MainUnityActivity] YesReportClick :$json")
listOfVehicleNames.add(json)
// TODO: I want send data to Flutter without close this activity
}
private fun showDialog() {
val builder = AlertDialog.Builder(this)
builder.setTitle("Report")
builder.setMessage("Is there something wrong ?")
builder.setPositiveButton(
"Yes"
) { _, _ ->
Toast.makeText(this, "Okay, we're sorry", Toast.LENGTH_SHORT).show()
notifyFlutterReportFromUnity()
}
builder.setNegativeButton(
"No"
) { _, _ ->
// User click no
}
builder.setNeutralButton("Cancel") { _, _ ->
// User cancelled the dialog
}
builder.show()
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
最后,我使用
MethodChannel
、EventChannel
和BroadcastReceiver
修复了该问题。示例项目位于:https://github.com/rrifafauzikomara/example_flutter_method_channel
Finally, I fix it using
MethodChannel
,EventChannel
, andBroadcastReceiver
.The example project is here: https://github.com/rrifafauzikomara/example_flutter_method_channel