From a335558d4484f1430bf2b3ee9abaf144d2d51051 Mon Sep 17 00:00:00 2001 From: Filip Hracek Date: Mon, 20 May 2019 12:45:22 -0700 Subject: [PATCH] Migrate from scoped_model to provider (#81) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is the minimal possible change. It is meant to be readable as a standalone Pull Request. This does not touch comments. Additionally, it doesn’t use the niceties of provider, like automatic disposal of the model. Lastly, it doesn’t even rename the project from `scoped_model_counter`. All that will come in a follow-up PR. --- scoped_model_counter/lib/main.dart | 15 ++++++++------- scoped_model_counter/pubspec.yaml | 2 +- scoped_model_counter/test/widget_test.dart | 6 +++--- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/scoped_model_counter/lib/main.dart b/scoped_model_counter/lib/main.dart index 7b7e28ca4..558d44a50 100644 --- a/scoped_model_counter/lib/main.dart +++ b/scoped_model_counter/lib/main.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:scoped_model/scoped_model.dart'; +import 'package:provider/provider.dart'; void main() { // Initialize the model. Can be done outside a widget, like here. @@ -17,15 +17,15 @@ void main() { // Now we're ready to run the app... runApp( // ... and provide the model to all widgets within. - ScopedModel( - model: counter, + ChangeNotifierProvider.value( + notifier: counter, child: MyApp(), ), ); } /// Simplest possible model, with just one field. -class Counter extends Model { +class Counter extends ChangeNotifier { int value = 0; void increment() { @@ -63,8 +63,8 @@ class MyHomePage extends StatelessWidget { // and retrieves its model (Counter, in this case). // Then it uses that model to build widgets, and will trigger // rebuilds if the model is updated. - ScopedModelDescendant( - builder: (context, child, counter) => Text( + Consumer( + builder: (context, counter, child) => Text( '${counter.value}', style: Theme.of(context).textTheme.display1, ), @@ -78,7 +78,8 @@ class MyHomePage extends StatelessWidget { // the current model and doesn't automatically trigger rebuilds. // Since this button always looks the same, though, no rebuilds // are needed. - onPressed: () => ScopedModel.of(context).increment(), + onPressed: () => + Provider.of(context, listen: false).increment(), tooltip: 'Increment', child: Icon(Icons.add), ), diff --git a/scoped_model_counter/pubspec.yaml b/scoped_model_counter/pubspec.yaml index d6629b3e7..de6d3a6f7 100644 --- a/scoped_model_counter/pubspec.yaml +++ b/scoped_model_counter/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter - scoped_model: ^1.0.1 + provider: ^2.0.1 cupertino_icons: ^0.1.2 diff --git a/scoped_model_counter/test/widget_test.dart b/scoped_model_counter/test/widget_test.dart index e6251998d..28e3e150a 100644 --- a/scoped_model_counter/test/widget_test.dart +++ b/scoped_model_counter/test/widget_test.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:scoped_model/scoped_model.dart'; +import 'package:provider/provider.dart'; import 'package:scoped_model_counter/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app, provide it with a model, and trigger a frame. await tester.pumpWidget( - ScopedModel( - model: Counter(), + ChangeNotifierProvider( + builder: (_) => Counter(), child: MyApp(), ), );