首页 > 解决方案 > 如何在第二条路线中定义提供者

问题描述

这是我的代码:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:sqflite/sqflite.dart';

void main() {
  runApp(
    Provider(
      create: (context) => Lists(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Event Manager',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Event Manager Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Event Manager Home Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Hewwo',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => NewItem(),
            ),
          );
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class Lists extends ChangeNotifier {
  void stuffToBeDone(){
    notifyListeners();
  }
}

class NewItem extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Provider(
      create: (context) => EventDatabase(),
      child: NewItemWidget(),
    );
  }
}

class NewItemWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<NewItem>(
      builder: (context, myClass, child) => Stack(
        children: [
          // Use SomeExpensiveWidget here, without rebuilding every time.
          child,
          Text("${Provider.of<EventDatabase>(context).path}"),
        ],
      ),
      // Build the expensive widget here.
    );
  }
}

class EventDatabase extends ChangeNotifier {
  String path = "";
  void db() async {
    final Future<Database> database =
        openDatabase(join(await getDatabasesPath(), 'life.db'));
    path = join(await getDatabasesPath(), 'life.db');
    notifyListeners();
  }
}

这是我得到的错误:

错误

我应该如何正确定义第二条路线的提供者?

我找不到任何关于此的教程,我一直在阅读 Provider 文档并且找不到任何东西。

我是 Flutter 的新手,我正在学习 Provider,我只用一条路线就可以在我的应用程序上运行它,但是现在我正在学习 Navigator,我无法让 Provider 使用它,请指导我,非常感谢。

标签: flutterflutter-provider

解决方案


您应该在 中声明您的提供者main,并在 中删除NewItem

void main() {
  runApp(
    MultiProvider(
      providers: [
        Provider(create: (context) => Lists()),
        Provider(create: (context) => EventDatabase()),
      ],
      child: MyApp(),
    ),
  );
}

推荐阅读