Make the filter_ in mutator shared_ptr (#34944)

diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc
index 32acb94..1fb1d24 100644
--- a/flow/embedded_views.cc
+++ b/flow/embedded_views.cc
@@ -36,7 +36,8 @@
   vector_.push_back(element);
 };
 
-void MutatorsStack::PushBackdropFilter(const DlImageFilter& filter) {
+void MutatorsStack::PushBackdropFilter(
+    std::shared_ptr<const DlImageFilter> filter) {
   std::shared_ptr<Mutator> element = std::make_shared<Mutator>(filter);
   vector_.push_back(element);
 };
diff --git a/flow/embedded_views.h b/flow/embedded_views.h
index 5e801de..394fa9d 100644
--- a/flow/embedded_views.h
+++ b/flow/embedded_views.h
@@ -70,8 +70,8 @@
   explicit Mutator(const SkMatrix& matrix)
       : type_(kTransform), matrix_(matrix) {}
   explicit Mutator(const int& alpha) : type_(kOpacity), alpha_(alpha) {}
-  explicit Mutator(const DlImageFilter& filter)
-      : type_(kBackdropFilter), filter_(&filter) {}
+  explicit Mutator(std::shared_ptr<const DlImageFilter> filter)
+      : type_(kBackdropFilter), filter_(filter) {}
 
   const MutatorType& GetType() const { return type_; }
   const SkRect& GetRect() const { return rect_; }
@@ -119,15 +119,18 @@
  private:
   MutatorType type_;
 
+  // TODO(cyanglaz): Remove union.
+  //  https://github.com/flutter/flutter/issues/108470
   union {
     SkRect rect_;
     SkRRect rrect_;
     SkMatrix matrix_;
     SkPath* path_;
     int alpha_;
-    const DlImageFilter* filter_;
   };
 
+  std::shared_ptr<const DlImageFilter> filter_;
+
 };  // Mutator
 
 // A stack of mutators that can be applied to an embedded platform view.
@@ -148,7 +151,7 @@
   void PushClipPath(const SkPath& path);
   void PushTransform(const SkMatrix& matrix);
   void PushOpacity(const int& alpha);
-  void PushBackdropFilter(const DlImageFilter& filter);
+  void PushBackdropFilter(std::shared_ptr<const DlImageFilter> filter);
 
   // Removes the `Mutator` on the top of the stack
   // and destroys it.
diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc
index cfc642d..a460125 100644
--- a/flow/mutators_stack_unittests.cc
+++ b/flow/mutators_stack_unittests.cc
@@ -91,11 +91,21 @@
 
 TEST(MutatorsStack, PushBackdropFilter) {
   MutatorsStack stack;
-  auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp);
-  stack.PushBackdropFilter(filter);
-  auto iter = stack.Bottom();
-  ASSERT_TRUE(iter->get()->GetType() == MutatorType::kBackdropFilter);
-  ASSERT_TRUE(iter->get()->GetFilter() == filter);
+  const int num_of_mutators = 10;
+  for (int i = 0; i < num_of_mutators; i++) {
+    auto filter = std::make_shared<DlBlurImageFilter>(i, 5, DlTileMode::kClamp);
+    stack.PushBackdropFilter(filter);
+  }
+
+  auto iter = stack.Begin();
+  int i = 0;
+  while (iter != stack.End()) {
+    ASSERT_EQ(iter->get()->GetType(), MutatorType::kBackdropFilter);
+    ASSERT_EQ(iter->get()->GetFilter().asBlur()->sigma_x(), i);
+    ++iter;
+    ++i;
+  }
+  ASSERT_EQ(i, num_of_mutators);
 }
 
 TEST(MutatorsStack, Pop) {