FLB2FlutterViewContainer.m 6.33 KB
Newer Older
Jidong Chen's avatar
init  
Jidong Chen committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * The MIT License (MIT)
 * 
 * Copyright (c) 2019 Alibaba Group
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

Jidong Chen's avatar
Jidong Chen committed
25 26
#import "FLB2FlutterViewContainer.h"
#import "FLB2FlutterApplication.h"
Jidong Chen's avatar
Jidong Chen committed
27
#import "BoostMessageChannel.h"
28 29
#import "FLB2FlutterContainerManager.h"
#import "FlutterBoostPlugin2_private.h"
Jidong Chen's avatar
init  
Jidong Chen committed
30

31
#define FLUTTER_APP [FlutterBoostPlugin2 sharedInstance].application
Jidong Chen's avatar
Jidong Chen committed
32 33
#define FLUTTER_VIEW FLUTTER_APP.flutterViewController.view
#define FLUTTER_VC FLUTTER_APP.flutterViewController
Jidong Chen's avatar
init  
Jidong Chen committed
34

Jidong Chen's avatar
Jidong Chen committed
35
@interface FLB2FlutterViewContainer  ()
Jidong Chen's avatar
init  
Jidong Chen committed
36 37 38 39
@property (nonatomic,strong,readwrite) NSDictionary *params;
@property (nonatomic,assign) long long identifier;
@end

Jidong Chen's avatar
Jidong Chen committed
40
@implementation FLB2FlutterViewContainer
Jidong Chen's avatar
init  
Jidong Chen committed
41

Jidong Chen's avatar
Jidong Chen committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
- (instancetype)init
{
    [FLUTTER_APP.flutterProvider prepareEngineIfNeeded];
    if(self = [super initWithEngine:FLUTTER_APP.flutterProvider.engine
                            nibName:nil
                             bundle:nil]){
        [self _setup];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super initWithCoder: aDecoder]) {
        NSAssert(NO, @"unsupported init method!");
        [self _setup];
    }
    return self;
}

Jidong Chen's avatar
init  
Jidong Chen committed
61 62 63 64 65
- (void)setName:(NSString *)name params:(NSDictionary *)params
{
    if(!_name && name){
        _name = name;
        _params = params;
Jidong Chen's avatar
Jidong Chen committed
66
        [BoostMessageChannel didInitPageContainer:^(NSNumber *r) {}
Jidong Chen's avatar
init  
Jidong Chen committed
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
                                               pageName:name
                                                 params:params
                                               uniqueId:[self uniqueIDString]];
    }
}


static NSUInteger kInstanceCounter = 0;

+ (NSUInteger)instanceCounter
{
    return kInstanceCounter;
}

+ (void)instanceCounterIncrease
{
    kInstanceCounter++;
    if(kInstanceCounter == 1){
Jidong Chen's avatar
Jidong Chen committed
85
        [FLUTTER_APP resume];
Jidong Chen's avatar
init  
Jidong Chen committed
86 87 88 89 90 91 92
    }
}

+ (void)instanceCounterDecrease
{
    kInstanceCounter--;
    if([self.class instanceCounter] == 0){
Jidong Chen's avatar
Jidong Chen committed
93
        [FLUTTER_APP pause];
Jidong Chen's avatar
init  
Jidong Chen committed
94 95 96 97 98 99 100 101
    }
}

- (NSString *)uniqueIDString
{
    return @(_identifier).stringValue;
}

102 103 104 105 106
- (void)_setup
{
    static long long sCounter = 0;
    _identifier = sCounter++;
    [self.class instanceCounterIncrease];
Jidong Chen's avatar
init  
Jidong Chen committed
107 108 109 110 111 112 113 114 115 116
}

- (void)dealloc
{
    [self notifyWillDealloc];
    [NSNotificationCenter.defaultCenter removeObserver:self];
}

- (void)notifyWillDealloc
{
Jidong Chen's avatar
Jidong Chen committed
117
    [BoostMessageChannel willDeallocPageContainer:^(NSNumber *r) {}
Jidong Chen's avatar
init  
Jidong Chen committed
118 119 120
                                               pageName:_name params:_params
                                               uniqueId:[self uniqueIDString]];

Jidong Chen's avatar
Jidong Chen committed
121
    [FLUTTER_APP removeViewController:self];
Jidong Chen's avatar
init  
Jidong Chen committed
122 123 124 125
    
    [self.class instanceCounterDecrease];
}

Jidong Chen's avatar
Jidong Chen committed
126 127 128 129
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = UIColor.whiteColor;
}
Jidong Chen's avatar
init  
Jidong Chen committed
130 131 132 133 134 135 136

#pragma mark - ScreenShots
- (BOOL)isFlutterViewAttatched
{
    return FLUTTER_VIEW.superview == self.view;
}

Jidong Chen's avatar
Jidong Chen committed
137
- (void)attatchFlutterEngine
Jidong Chen's avatar
init  
Jidong Chen committed
138
{
Jidong Chen's avatar
Jidong Chen committed
139 140
    [FLUTTER_APP.flutterProvider prepareEngineIfNeeded];
    [FLUTTER_APP.flutterProvider atacheToViewController:self];
Jidong Chen's avatar
init  
Jidong Chen committed
141 142
}

Jidong Chen's avatar
Jidong Chen committed
143
- (void)detatchFlutterEngine
Jidong Chen's avatar
init  
Jidong Chen committed
144
{
Jidong Chen's avatar
Jidong Chen committed
145
    [FLUTTER_APP.flutterProvider detach];
Jidong Chen's avatar
init  
Jidong Chen committed
146 147 148 149 150 151 152
}

#pragma mark - Life circle methods

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
Jidong Chen's avatar
Jidong Chen committed
153
    [FLUTTER_APP resume];
Jidong Chen's avatar
init  
Jidong Chen committed
154 155 156 157 158 159
}

- (void)viewWillAppear:(BOOL)animated
{
    //For new page we should attach flutter view in view will appear
    //for better performance.
Jidong Chen's avatar
Jidong Chen committed
160
 
Jidong Chen's avatar
Jidong Chen committed
161
    [BoostMessageChannel willShowPageContainer:^(NSNumber *result) {}
Jidong Chen's avatar
init  
Jidong Chen committed
162 163 164 165
                                            pageName:_name
                                              params:_params
                                            uniqueId:self.uniqueIDString];
    //Save some first time page info.
166 167 168 169
    if(![FlutterBoostPlugin2 sharedInstance].fPagename){
        [FlutterBoostPlugin2 sharedInstance].fPagename = _name;
        [FlutterBoostPlugin2 sharedInstance].fPageId = self.uniqueIDString;
        [FlutterBoostPlugin2 sharedInstance].fParams = _params;
Jidong Chen's avatar
init  
Jidong Chen committed
170 171 172 173 174 175 176
    }
    
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
Jidong Chen's avatar
Jidong Chen committed
177
    [FLUTTER_APP addUniqueViewController:self];
Jidong Chen's avatar
init  
Jidong Chen committed
178
    
Jidong Chen's avatar
Jidong Chen committed
179 180
    //Ensure flutter view is attached.
    [self attatchFlutterEngine];
Jidong Chen's avatar
Jidong Chen committed
181
 
Jidong Chen's avatar
Jidong Chen committed
182
    [BoostMessageChannel didShowPageContainer:^(NSNumber *result) {}
Jidong Chen's avatar
init  
Jidong Chen committed
183 184 185
                                           pageName:_name
                                             params:_params
                                           uniqueId:self.uniqueIDString];
186 187
    //NOTES:务必在show之后再update,否则有闪烁
    [self surfaceUpdated:YES];
Jidong Chen's avatar
init  
Jidong Chen committed
188 189 190 191 192
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
Jidong Chen's avatar
Jidong Chen committed
193
    [BoostMessageChannel willDisappearPageContainer:^(NSNumber *result) {}
Jidong Chen's avatar
init  
Jidong Chen committed
194 195 196
                                                 pageName:_name
                                                   params:_params
                                                 uniqueId:self.uniqueIDString];
197
    [[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Jidong Chen's avatar
init  
Jidong Chen committed
198 199 200 201 202 203
    [super viewWillDisappear:animated];
}


- (void)viewDidDisappear:(BOOL)animated
{
Jidong Chen's avatar
Jidong Chen committed
204
    [BoostMessageChannel didDisappearPageContainer:^(NSNumber *result) {}
Jidong Chen's avatar
init  
Jidong Chen committed
205 206 207
                                                pageName:_name
                                                  params:_params
                                                uniqueId:self.uniqueIDString];
208 209
    [super viewDidDisappear:animated];
    
Jidong Chen's avatar
init  
Jidong Chen committed
210 211
}

Jidong Chen's avatar
Jidong Chen committed
212 213 214 215 216 217 218 219 220
- (void)installSplashScreenViewIfNecessary {
    //Do nothing.
}

- (BOOL)loadDefaultSplashScreenView
{
    return NO;
}

Jidong Chen's avatar
init  
Jidong Chen committed
221 222

@end