You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将MainActivity.java的int值传递到Flutter指定Dart文件且避免接收null

问题解决

错误原因

你通过Intent.putExtra()传递给FlutterActivity的参数属于Android原生层的Intent附加数据,Flutter的ModalRoute.of(context).settings.arguments只能获取Flutter内部导航跳转时传递的参数,两者数据链路不互通,所以必然拿到null值。

解决方法一:路由拼接传参(适合简单参数,推荐当前场景使用)

将参数直接拼接在初始路由中,Flutter侧通过解析路由字符串即可拿到参数,不需要额外适配代码。

修改Android端MainActivity.java代码

删除原来的putExtra调用,把参数拼在initialRoute里:

private void goToFruit(String fruitName, DeepLink dlData) {
    String fruitClassName = (fruitName.substring(0, 1).toUpperCase() + fruitName.substring(1)).concat("Activity");
    Log.d("DEEPLINKING", "Looking for class " + fruitClassName);
    // 把teacherId拼在路由后面
    startActivity(FlutterActivity.withNewEngine().initialRoute("/teacherdetail?teacherId=7324").build(this));
    Log.d("DEEPLINKING", "Intent run Successfully");    
}

修改Flutter端路由解析逻辑

在MaterialApp的onGenerateRoute回调中解析路由参数,传递给目标页面:

MaterialApp(
  // 其他配置不变
  onGenerateRoute: (settings) {
    final routeUri = Uri.parse(settings.name ?? '');
    // 匹配教师详情页路由
    if (routeUri.path == '/teacherdetail') {
      // 取出teacherId并转成int类型,注意加判空处理避免崩溃
      final teacherId = int.tryParse(routeUri.queryParameters['teacherId'] ?? '0');
      // 构造TeacherDetails对象作为路由参数传递
      final args = TeacherDetails(id: teacherId);
      return MaterialPageRoute(
        builder: (context) => const TeacherDetailsScreenOne(),
        settings: RouteSettings(arguments: args),
      );
    }
    // 其他路由的处理逻辑
    return null;
  },
);

修改后你原来的teacher_details_screen_one.dart中用ModalRoute拿参数的代码就可以正常获取到值了。

解决方法二:Platform Channel获取原生Intent参数(适合复杂参数/后续需要双向交互的场景)

如果不想修改路由,或者需要传递复杂的自定义对象,可以通过MethodChannel让Flutter主动向原生层请求Intent参数。

修改Android端MainActivity.java代码

public class MainActivity extends FlutterActivity {
  // 自定义Channel名,保证Flutter端和原生端一致即可
  private static final String CHANNEL = "com.yourAppName/dataChannel";

  @Override
  public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    super.configureFlutterEngine(flutterEngine);
    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
      .setMethodCallHandler((call, result) -> {
        if (call.method.equals("getTeacherId")) {
          // 从Intent中取出参数返回给Flutter
          int teacherId = getIntent().getIntExtra("teacherId", -1);
          result.success(teacherId);
        } else {
          result.notImplemented();
        }
      });
  }
}

修改Dart端teacher_details_screen_one.dart代码

import 'package:flutter/services.dart';

class TeacherDetailsScreenOne extends StatefulWidget {
  const TeacherDetailsScreenOne({super.key});

  @Override
  State<TeacherDetailsScreenOne> createState() => _TeacherDetailsScreenOneState();
}

class _TeacherDetailsScreenOneState extends State<TeacherDetailsScreenOne> {
  // 和原生端保持相同的Channel名
  static const platform = MethodChannel('com.yourAppName/dataChannel');
  int? teacherId;

  @override
  void initState() {
    super.initState();
    _fetchTeacherId();
  }

  Future<void> _fetchTeacherId() async {
    try {
      final id = await platform.invokeMethod<int>('getTeacherId');
      setState(() {
        teacherId = id;
      });
    } on PlatformException catch (e) {
      debugPrint('获取教师ID失败:${e.message}');
    }
  }

  @override
  Widget build(BuildContext context) {
    // 拿到teacherId后即可正常使用
    return Scaffold(...);
  }
}

注意事项

  • 第一种路由拼接的方案实现成本更低,适合当前只有单个int参数的场景
  • 参数解析时请增加判空、类型校验逻辑,避免参数缺失或格式错误导致应用崩溃
  • 如果频繁跳转Flutter页面,建议使用缓存Flutter引擎代替withNewEngine(),可减少性能消耗,传参逻辑和上述方案一致

内容的提问来源于stack exchange,提问作者Bhavin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 06:06:03