当前位置: 首页 > 工具软件 > iOS7Colors > 使用案例 >

iOS Native跳转到Flutter页面

山翼
2023-12-01

iOS原生页面跳转到指定Flutter页面

override func viewDidLoad() {
        super.viewDidLoad()  
     
        view.backgroundColor = .white

        let nextBtn = UIButton(type: .custom)
        nextBtn.frame = CGRect(x: 0, y: 0, width: 120, height: 50)
        nextBtn.setTitle("跳转Flutter", for: .normal)
        nextBtn.setTitleColor(.blue, for: .normal)
        view.addSubview(nextBtn)
        nextBtn.center = view.center
        nextBtn.addTarget(self, action: #selector(gotoNextEvent), for: .touchUpInside)
        
        // Do any additional setup after loading the view.
}

// iOS 跳转到指定Flutter路由页面
@objc func gotoNextEvent() {
        let flutterViewController = FlutterViewController(project:nil,  initialRoute: "mine", nibName: nil, bundle: nil)
        self.navigationController?.pushViewController(flutterViewController, animated: true)
        flutterSetup()
}

Flutter 返回iOS原生回调

 func flutterSetup() {
        let navigation = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController
        guard let contoller = navigation?.topViewController as? FlutterViewController else {
            fatalError("contoller is not type FlutterViewController")
        }
        let flutterChannel = FlutterMethodChannel(name: "com.flutterToNative.second", binaryMessenger: contoller.binaryMessenger)
        flutterChannel.setMethodCallHandler { call, result in
            if call.method == "backToNative" {
                self.navigationController?.popViewController(animated: true)
            } else {
                result(FlutterMethodNotImplemented)
            }
        }
    }

flutter 对应代码如下:

import 'package:flutter/material.dart';
import 'package:my_app/home.dart';
import 'package:my_app/mine.dart';

void main() {
  runApp(const MyApp());
}

Map<String, WidgetBuilder> routes = {
  "home": (context) => const HomePage(),
  "mine": (context) => const MinePage()
};

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
      ),
      home: const HomePage(),
      initialRoute: 'home',
      routes: routes,
    );
  }
}
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class MinePage extends StatefulWidget {
  const MinePage({Key? key}) : super(key: key);

  @override
  _MinePageState createState() => _MinePageState();
}

class _MinePageState extends State<MinePage> {
  static const methodChannel = MethodChannel('com.flutterToNative.second');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text(''),
        backgroundColor: Colors.blue,
        systemOverlayStyle: SystemUiOverlayStyle.light,
        leading: IconButton(
          icon: const Icon(Icons.arrow_back_ios),
          onPressed: () => {methodChannel.invokeMethod('backToNative')},
        ),
      ),
      body: const Center(
        child: Text('这是我的页面'),
      ),
    );
  }
}

 类似资料: