// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; /// Flutter code sample for [SharedAppData]. // A single lazily-constructed object that's shared with the entire application // via `SharedObject.of(context)`. The value of the object can be changed with // `SharedObject.reset(context)`. Resetting the value will cause all of the // widgets that depend on it to be rebuilt. class SharedObject { SharedObject._(); static final Object _sharedObjectKey = Object(); @override String toString() => describeIdentity(this); static void reset(BuildContext context) { // Calling SharedAppData.setValue() causes dependent widgets to be rebuilt. SharedAppData.setValue<Object, SharedObject>(context, _sharedObjectKey, SharedObject._()); } static SharedObject of(BuildContext context) { // If a value for _sharedObjectKey has never been set then the third // callback parameter is used to generate an initial value. return SharedAppData.getValue<Object, SharedObject>(context, _sharedObjectKey, () => SharedObject._()); } } // An example of a widget which depends on the SharedObject's value, which might // be provided - along with SharedObject - in a Dart package. class CustomWidget extends StatelessWidget { const CustomWidget({super.key}); @override Widget build(BuildContext context) { // Will be rebuilt if the shared object's value is changed. return ElevatedButton( child: Text('Replace ${SharedObject.of(context)}'), onPressed: () { SharedObject.reset(context); }, ); } } class Home extends StatelessWidget { const Home({super.key}); @override Widget build(BuildContext context) { return const Scaffold( body: Center(child: CustomWidget()), ); } } void main() { runApp(const MaterialApp(home: Home())); }