如何将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
相关产品推荐
相关产品推荐

