Flutter 如何使用riverpod在颤振中导航到另一个屏幕时保持应用程序的状态

Flutter 如何使用riverpod在颤振中导航到另一个屏幕时保持应用程序的状态,flutter,dart,provider,riverpod,Flutter,Dart,Provider,Riverpod,大家好 我刚开始使用Riverpod,我有一个计数器应用程序,当点击FAB按钮时,计数器会增加1。这在使用Riverpod ChangeNotifierProvider时效果很好。 我目前遇到的问题是,当我单击另一个按钮将用户带到第二个屏幕时,计数器的状态将保留在第二个屏幕中 下面是我的代码 主飞镖 import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; im

大家好

我刚开始使用Riverpod,我有一个计数器应用程序,当点击FAB按钮时,计数器会增加1。这在使用Riverpod ChangeNotifierProvider时效果很好。 我目前遇到的问题是,当我单击另一个按钮将用户带到第二个屏幕时,计数器的状态将保留在第二个屏幕中

下面是我的代码

主飞镖

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_riverpod_app/counter.dart';
import 'package:flutter_riverpod_app/second_screen.dart';

final counterProvider = ChangeNotifierProvider<Counter>((ref) => Counter());

void main() {
  runApp(ProviderScope(
    child: MyApp(),
  ));
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        // Center is a layout widget. It takes a single child and positions it
        // in the middle of the parent.
        child: Consumer(builder: (context, watch, _) {
          final count = watch(counterProvider);
          return Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'You have pushed the button this many times:',
              ),
              Text(
                '${count.count}',
                style: Theme.of(context).textTheme.headline4,
              ),
              FlatButton(
                  onPressed: () {
                    Navigator.push(
                        context,
                        MaterialPageRoute(
                            builder: (BuildContext context) => SecondScreen()));
                  },
                  child: Text('Go to second screen'))
            ],
          );
        }),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.read(counterProvider).updateCount(),
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

我真的不知道如何在第二个屏幕上获取计数器的状态,如果它是提供程序包,我只需在第二个屏幕上使用
Provider.of(context,listen:false)。计数器
将显示计数器。

问题是您创建了两次提供程序。您只需要创建一次并全局访问它

删除
final counterProvider=ChangeNotifierProvider((ref)=>Counter())从第二个屏幕导入,而从第一个屏幕导入反提供程序,它将按照您的预期运行

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_riverpod_app/counter.dart';

final counterProvider = ChangeNotifierProvider<Counter>((ref) => Counter());

class SecondScreen extends ConsumerWidget {
  @override
  Widget build(BuildContext context, watch) {
    final counter = watch(counterProvider);
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Screen'),
      ),
      body: Center(
        child: Text('${counter.count}', style: TextStyle(fontSize: 30,),),
      ),
    );
  }
}

import 'package:flutter/foundation.dart';

class Counter extends ChangeNotifier {
  int count = 0;

  updateCount() {
    count++;
    notifyListeners();
  }
}