【问题标题】:Flutter package provider with templates带有模板的 Flutter 包提供程序
【发布时间】:2020-03-24 20:04:33
【问题描述】:

我正在尝试将提供程序与模板一起使用,但 Provider.of 似乎不能那样工作。

日志:

══╡ 小部件库发现异常 ╞═════════════════════════════════════════════════ ══════════ 以下 ProviderNotFoundError 被抛出构建 MyChildWidget(脏):错误:找不到正确的 此 MyChildWidget Widget 上方的提供者

要修复,请:

  • 确保 Provider 是此 MyChildWidget 小部件的祖先
  • 向 Provider 提供类型
  • 向消费者提供类型
  • 向 Provider.of() 提供类型
  • 始终使用包导入。例如:`import 'package:my_app/my_code.dart';
  • 确保使用了正确的context

你知道有什么解决办法吗?

显示问题的示例:

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

void main() => runApp(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,
      ),
      home: Provider<MyChildState>.value(
          value: MyChildState("Hello world !"),
          child: MaterialApp(
            home: MyChildWidget(),
          )),
    );
  }
}

abstract class MyParentWidget<State extends MyParentState> extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final State state = Provider.of(context);
    return Text(state.text);
  }
}

abstract class MyParentState {
  final String text;

  MyParentState(this.text);
}

class MyChildWidget<MyChildState> extends MyParentWidget{
}

class MyChildState extends MyParentState {
  MyChildState(String text) : super(text);
}

【问题讨论】:

    标签: flutter dart flutter-provider


    【解决方案1】:

    乍一看您的代码,我可以看到您将MyChildState("Hello world !") 作为值传递,但稍后在MyParentWidget 类中您请求State 对象final State state = Provider.of(context);

    尝试请求MyChildState 而不是State

    阅读您的代码后,我的第一印象是您来自不同的编程语言,现在您正在尝试 Flutter。一个友好的建议是让一切尽可能简单

    所有的抽象和代码的组织方式可能会在您稍后查看您编写的代码时让您感到困惑,而不是帮助您。

    【讨论】:

    • 是的,我来自 Android。在这里,我想与“通用小部件”共享 UI 逻辑以进行继承。我使用 bloc 为每个小部件提供 stream ,但是如果 2 个小部件有一些共同的 UI 逻辑,我想在父小部件中提取此逻辑(因此父级将使用父级状态来应用通用逻辑,并且子级可以覆盖此行为为他的改变)。
    • 但就像你说的,我可以尝试从父级提取状态提供,每个子级使用 provider.of 恢复他的状态,并在父级小部件中创建方法以从子级调用。
    • 我建议你去那里尝试一些教程并阅读有关 Flutter 状态管理的内容。你对 Flutter 应用程序的看法有点令人困惑。在我的项目中,我从未将抽象类用于 UI 目的,例如拥有父级和子级,然后父级具有一些子级可以覆盖的功能。通常,每个 Widget 都代表屏幕上的一个元素。你想把它建模成一个有孩子的 Widget 吗?在构造函数中添加 children 参数,就像 Column 小部件所做的那样。我建议你通过现有的小部件的实现来更好地理解 Flutter
    • 例如对于 2 个屏幕,我需要输入电子邮件,如果正则表达式错误等会显示错误...所以我将创建“EmailWidget”并在 2 个屏幕中使用它。但是,如果第三个屏幕需要输入电子邮件,但错误以不同的文本显示,我不会复制所有小部件,只需重写显示错误的方法。
    • 在这种情况下,我需要通用小部件,但“通用状态”肯定是错误的方式。对于其他情况,我需要相同的状态,但一些具有相同行为的小部件需要附加信息,这就是为什么我考虑在不重写所有小部件的情况下覆盖状态
    猜你喜欢
    • 2020-08-09
    • 2021-09-30
    • 2021-04-16
    • 2019-12-24
    • 1970-01-01
    • 2020-10-03
    • 2021-12-15
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多