flutter登陆注册(flutter 在线客服)

网友投稿 1389 2022-12-26

本篇文章给大家谈谈flutter登陆注册,以及flutter 在线客服对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享flutter登陆注册的知识,其中也会对flutter 在线客服进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Flutter注册iOS推送

####总结:

Flutter在iOS中AppDelegate继承自FlutterAppDelegate,所以很多方法必须重写父类中的方法。iOS的推送注册流程还是一样的。不一样的是需要给推送设置别名或者将设备的deviceToken上传到推送服务器,这一步可以原生实现也可以flutter实现,但是还是需要和flutter进行交互,这是就需要注册一个通道实现这个。通道也可以增加别的一些例如:信息处理等。

正文:

在进行iOS上开发,发现Flutter创建的项目不走didRegisterForRemoteNotificationsWithDeviceToken,起初以为是没有设置UNUserNotificationCenterDelegate,后来发现AppDelegate是继承于FlutterAppDelegate的,
也就是将原生的UIApplicationDelegate的方法都会被FlutterAppDelegate拦截,即使我们不实现didRegisterForRemoteNotificationsWithDeviceToken,我觉得应该有两种方法可以实现:第一种是需要重写父类的推送方法。第二种就是在dart文件中监听系统代理,通过通道回调appdelegate来实现,

下面是百度云推送,重写父类代理的实现:

在didFinishLaunchingWithOptions launchOptions: 中注册原生交互channel

override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? ) - Bool {

        //Flutter Plugin插件注册

        GeneratedPluginRegistrant.register(with: self);

        //调用appdelegate 的 设置、注册远程推送

        self.requestAuthorization(application: application);

        //Flutter原生交互通道

        self.BPushChannel();

        //注册BPush通道

        BPush.registerChannel(launchOptions, apiKey: BPushKey, pushMode: BPushMode.development, withFirstAction: "打开", withSecondAction: "关闭", withCategory: nil, useBehaviorTextInput: true, isDebug: true);

        //禁用地理位置信息推送

        BPush.disableLbs();

        return super.application(application, didFinishLaunchingWithOptions: launchOptions);

    }

    //MARK:注册远程推送通知

    func requestAuthorization(application: UIApplication) {

        if #available(iOS 10.0, *) {

            UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate;

            UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert]) { (granted, error) in

                if granted == true {

                    DispatchQueue.main.async {

                        application.registerForRemoteNotifications()

                    }

                }

            }

        } else if #available(iOS 8.0, *) {

            let types:UIUserNotificationType = [.badge , .alert , .sound]

            let settings:UIUserNotificationSettings = UIUserNotificationSettings(types: types, categories: nil)

            application.registerUserNotificationSettings(settings)

        } else {

            let types:UIRemoteNotificationType = [UIRemoteNotificationType.alert, UIRemoteNotificationType.badge, .sound]

            application.registerForRemoteNotifications(matching: types)

        }

    }

    //百度推送通道

    func BPushChannel() - Void {

        //获取系统的跟控制器

        let controller = self.window.rootViewController

        //建立rootViewController和Flutter的通信通道

        let pushChannel = FlutterMethodChannel.init(name: channelNameForPush, binaryMessenger:controller as! FlutterBinaryMessenger)

        //设置Method回调 FlutterMethodCall包含了method的Name,ID等信息, FlutterResult是给Native和Flutter的通信回调

        pushChannel.setMethodCallHandler { (FlutterMethodCall, FlutterResult) in

            print("pushChannel");

        }

        //绑定channelId到服务器

        let pushBind = FlutterMethodChannel.init(name:channelNameForPushBind, binaryMessenger: controller as! FlutterBinaryMessenger)

        pushBind.setMethodCallHandler { (FlutterMethodCall, FlutterResult) in

            //FlutterResult();结果回调,回调的结果只能为string类型

            if(self.channelId.isEmpty){

                FlutterResult(FlutterMethodNotImplemented);

            } else{

                print("channelId",self.channelId);

                let dic : Dictionary<String,String = ["channelId":self.channelId];

                let data = try? JSONSerialization.data(withJSONObject: dic, options: [])

                let encodingStr = String(data: data!, encoding: String.Encoding.utf8)!

//将信息传到Flutter,

                FlutterResult(encodingStr);

            }

        }

    }

    // 重写远程推送通知 注册成功

    override func application(_ application: UIApplication , didRegisterForRemoteNotificationsWithDeviceToken deviceToken:Data) {

        //  向云推送注册 device token

        print("deviceToken = %@", deviceToken);

        BPush.registerDeviceToken(deviceToken as Data)

        // 绑定channel.将会在回调中看获得channnelid appid userid 等

        BPush.bindChannel(completeHandler: { (result, error) - Void in

            if ((result) != nil){

                self.channelId = BPush.getChannelId();

                BPush.setTag("MyTag", withCompleteHandler: { (result, error) - Void in

                    if ((result) != nil){

                    }

                })

            }

        })

        super.application(application, didRegisterForRemoteNotificationsWithDeviceToken:deviceToken)

    }

// 重写注册失败

    override func application(_ application: UIApplication , didFailToRegisterForRemoteNotificationsWithError error: Error ) {

        print("deviceToken = %@", error)

        super.application(application, didFailToRegisterForRemoteNotificationsWithError: error)

    }
**如果解决了你的问题,点个赞呗!**

完美解决flutter 键盘遮挡/超出(overflow)的坑

一个正常的app,一般都会有登录,注册,密码修改等基本功能界面,如上图的界面再正常不过了吧.这里面就会遇到键盘超出的坑
oh ~~

说实话,我也在网上找了一些解决键盘超出,覆盖的方法,大概有2种方法

在Scaffold里面添加属性resizeToAvoidBottomPadding,设置为false.就是内容不会随键盘弹出而滚动

在有textField的外面包裹一层SingleChildScrollView,这样内容就会随键盘弹出而滚动

前面2个方法基本可以解决大部分的坑了,但有一种坑还是解决不了,就是像开篇那样的效果,上面有textField,底部有提交按钮,你就会发现有各种bug在里面, 最终的解决方案用到了一个第三方库

包裹一层KeyboardAvoider,并且设置属性autoScroll: true,这样就可以完美解决问题,看最终效果图

iOS(Swift版)Flutter集成关键步骤

1.在项目目录执行 flutter create -t module XXX(flutter模块名) ;
2.修改Podfileflutter登陆注册,设置path,关联podhelper.rb,注意采用 load File.join() ,不采用之前的eval语句,在target do下install;
3.执行pod install;
4.修改AppDelegate为FlutterAppDelegate;
5.初始化并注册FlutterEngine;
6.vscode里flutter attach实时调试;
做完这些正常开发是可以flutter登陆注册了,至于打包需要更改什么再续。

Flutter Plugin的坑

[GeneratedPluginRegistrant registerWithRegistry:self]默认注册到self.window.rootViewController的。 所以需要先初始化rootViewController,再注册Plugin。

如果Window的rootViewController不是FlutterViewController,直接注册Plugin会注册失败。我们需要将Plugin注册到指定的FlutterViewController。

Flutter App启动后,Native调用Flutter失败?
这是因为Plugin Channel的初始化大概要1.5秒,而且这是一个异步过程。虽然Flutter页面显示出来了,但是Plugin Channel还没初始化完,所以这时Native调用Flutter是没反应的。

Flutter(六)Android与Flutter混合开发(Hybird)

如果我们目前的项目是Android的,但是接下来我们希望部分页面可以使用Flutter进行开发,甚至我们希望在Native页面中嵌入FlutterUI组件,那么我们该如何实现呢?

假设你现在Android项目的目录的结构是这样的

这时候如果你想创建一个Flutter模块,使得Android模块和Flutter模块之间可以进行交互,我们可以通过Android Studio新建一个Flutter Module,具体过程是:File — New — New Module ,之后选择Flutter Module,指定Project Location的路径为

也就是说,最终你的项目结构会是这样的

接下来在Android Module的 build.gradle 文件中添加flutter依赖

先创建一个Flutter页面

这里比较重要的是 window.defaultRouteName 这个字段,这个字段可以接收从Native传递过来的参数 (下文我们会介绍原生传递参数的方法),也就是说通过这个字段我们就可以进行Flutter页面的路由的分发

我们可以直接在Android的 MainActivity 中启动一个 FlutterActivity ,这里的 initialRoute 方法中传递的参数就对应Flutter层的 window.defaultRouteName

注意:需要在 AndroidManifest.xml 注册 FlutterActivity

自己创建一个 FlutterAppActivity 继承自 FlutterActivity

在 MainActivity 中启动 FlutterAppActivity (另外别忘了在 AndroidManifest.xml 中注册 FlutterAppActivity )

两种启动方式的区别

如果单纯只是想打开一个Flutter页面,两种方式实际上基本没有太大区别,第一种方式也许还会更简单一点。但是,在Flutter开发中,我们往往还需要开发一些Native插件供Flutter调用,如果使用复写 FlutterActivity 的方式更有利于我们在 FlutterActivity 中注册我们的Native插件,所以实际开发中一般推荐使用第二种方式

扩展思考

initialRoute 从名称上看起来是Flutter提供给我们进行Native与Flutter交互的路由跳转的,但是实际上他就是一个字符串,我们不仅仅可以传递一个路由名称,有时候我们也可以通过这个参数传递一串JSON数据,然后在Flutter端进行解析,这样我们就可以通过这个参数做更多的事情

activity_main.xml

FrameLayout 用于承载Flutter组件

MainActivity.java

使用 FragmentManager 将 FlutterFragment 添加到 FrameLayout 容器中

运行结果

上半部分是原生的TextView,下半部分是Flutter的Text组件

本节主要介绍了Native和Flutter之间的页面跳转,以及同一个页面中Native与Flutter组件的组合。接下来会介绍如何编写Android插件与Flutter进行数据交互

flutter_riverpod基础使用

1.全局增加ProviderScope

2.增加一个全局的store.dart文件,用于注册各个业务使用的store。以下是store.dart文件中的内容。

3.实现实际的业务需要。

4.在具体的页面,使用store。让页面继承ConsumerWidget 关于flutter登陆注册和flutter 在线客服的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 flutter登陆注册的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于flutter 在线客服、flutter登陆注册的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何使用BufferedReader循环读文件
下一篇:华阴一体化政务服务平台(华阴一体化政务服务平台网址)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~