16
16
#include " flutter/fml/closure.h"
17
17
#include " flutter/fml/make_copyable.h"
18
18
#include " flutter/fml/native_library.h"
19
+ #include " flutter/fml/status_or.h"
19
20
#include " flutter/fml/thread.h"
20
21
#include " third_party/dart/runtime/bin/elf_loader.h"
21
22
#include " third_party/dart/runtime/include/dart_native_api.h"
@@ -1529,12 +1530,14 @@ CreateEmbedderRenderTarget(
1529
1530
return render_target;
1530
1531
}
1531
1532
1532
- static std::pair<std::unique_ptr<flutter::EmbedderExternalViewEmbedder>,
1533
- bool /* halt engine launch if true */ >
1533
+ // / Creates an EmbedderExternalViewEmbedder.
1534
+ // /
1535
+ // / When a non-OK status is returned, engine startup should be halted.
1536
+ static fml::StatusOr<std::unique_ptr<flutter::EmbedderExternalViewEmbedder>>
1534
1537
InferExternalViewEmbedderFromArgs (const FlutterCompositor* compositor,
1535
1538
bool enable_impeller) {
1536
1539
if (compositor == nullptr ) {
1537
- return {nullptr , false };
1540
+ return std::unique_ptr<flutter::EmbedderExternalViewEmbedder> {nullptr };
1538
1541
}
1539
1542
1540
1543
auto c_create_callback =
@@ -1550,15 +1553,15 @@ InferExternalViewEmbedderFromArgs(const FlutterCompositor* compositor,
1550
1553
1551
1554
// Make sure the required callbacks are present
1552
1555
if (!c_create_callback || !c_collect_callback) {
1553
- FML_LOG (ERROR) << " Required compositor callbacks absent. " ;
1554
- return { nullptr , true } ;
1556
+ return fml::Status (fml::StatusCode:: kInvalidArgument ,
1557
+ " Required compositor callbacks absent. " ) ;
1555
1558
}
1556
1559
// Either the present view or the present layers callback must be provided.
1557
1560
if ((!c_present_view_callback && !c_present_callback) ||
1558
1561
(c_present_view_callback && c_present_callback)) {
1559
- FML_LOG (ERROR) << " Either present_layers_callback or present_view_callback "
1560
- " must be provided but not both. " ;
1561
- return { nullptr , true } ;
1562
+ return fml::Status (fml::StatusCode:: kInvalidArgument ,
1563
+ " Either present_layers_callback or "
1564
+ " present_view_callback must be provided but not both. " ) ;
1562
1565
}
1563
1566
1564
1567
FlutterCompositor captured_compositor = *compositor;
@@ -1601,10 +1604,9 @@ InferExternalViewEmbedderFromArgs(const FlutterCompositor* compositor,
1601
1604
};
1602
1605
}
1603
1606
1604
- return {std::make_unique<flutter::EmbedderExternalViewEmbedder>(
1605
- avoid_backing_store_cache, create_render_target_callback,
1606
- present_callback),
1607
- false };
1607
+ return std::make_unique<flutter::EmbedderExternalViewEmbedder>(
1608
+ avoid_backing_store_cache, create_render_target_callback,
1609
+ present_callback);
1608
1610
}
1609
1611
1610
1612
// Translates embedder metrics to engine metrics, or returns a string on error.
@@ -2258,7 +2260,8 @@ FlutterEngineResult FlutterEngineInitialize(size_t version,
2258
2260
2259
2261
auto external_view_embedder_result = InferExternalViewEmbedderFromArgs (
2260
2262
SAFE_ACCESS (args, compositor, nullptr ), settings.enable_impeller );
2261
- if (external_view_embedder_result.second ) {
2263
+ if (!external_view_embedder_result.ok ()) {
2264
+ FML_LOG (ERROR) << external_view_embedder_result.status ().message ();
2262
2265
return LOG_EMBEDDER_ERROR (kInvalidArguments ,
2263
2266
" Compositor arguments were invalid." );
2264
2267
}
@@ -2276,7 +2279,8 @@ FlutterEngineResult FlutterEngineInitialize(size_t version,
2276
2279
2277
2280
auto on_create_platform_view = InferPlatformViewCreationCallback (
2278
2281
config, user_data, platform_dispatch_table,
2279
- std::move (external_view_embedder_result.first ), settings.enable_impeller );
2282
+ std::move (external_view_embedder_result.value ()),
2283
+ settings.enable_impeller );
2280
2284
2281
2285
if (!on_create_platform_view) {
2282
2286
return LOG_EMBEDDER_ERROR (
0 commit comments