小编Ave*_*der的帖子

如何从子 Widget 更新父 Widget 的状态,同时更新 Flutter 中子 Widget 的状态?

我想请你帮忙解决这个问题。

我下面的示例代码旨在从子窗口小部件更新父窗口小部件的状态,同时也更新子窗口小部件的状态。父窗口小部件的文本值将更新,同时也会更改子窗口小部件按钮的颜色。

import 'package:flutter/material.dart';

void main() => runApp(AppIndex());

class AppIndex extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: ParentWidget());
  }
}

class ParentWidget extends StatefulWidget {
  @override
  _ParentWidgetState createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
  String _textValue = 'Old Value';

callback(newValue){
  setState(() {
    _textValue = newValue;
  });
}

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text(_textValue),
        ChildWidget(),
      ],
    );
  }
}

class ChildWidget extends StatefulWidget {
  String textValue;
  Function callback;

  ChildWidget({this.textValue, this.callback});

  @override
  _ChildWidgetState …
Run Code Online (Sandbox Code Playgroud)

flutter

9
推荐指数
1
解决办法
9555
查看次数

如何在 Flutter 中正确重用 Provider

所以我在我的小部件树中设置了这个 ChangeNotifierProvider,因为我看到很多子小部件来聆听它的价值。

我目前正在做的是,每当我要在我的子小部件上重用某些值/函数时,我都会通过构造函数将Provider.of(context)对象从父小部件传递给它的子小部件。例如,每次我为我的孩子小部件创建一个Provider.of(context)对象时,它似乎没有继承我在父 Provider 上的更新值,而是这个具有我的默认值 null/0/'empty'像它这样的只是被创造出来的。这导致我将初始Provider.of(context)对象传递给每个将使用 ChangeNotifier 更新值和函数的子级。

这个设置对我有用,但是,当我的小部件树开始变得复杂时,我不断地通过每个小部件向下传递值,甚至将值传递给一些甚至根本不使用它的人,只是为了让它的孩子听主提供者。

我认为我现在可能正在做的是提供者架构的反模式,我希望你们能以更优化和更有效的方式帮助我做到这一点。

非常感谢!

PS 文档中的一些内容我还没有完全掌握。

编辑以下以包含示例代码和可视化:

provider_type.dart

class ProviderType extends ChangeNotifier{
    String valueA = '';
    String valueB = '';
}
Run Code Online (Sandbox Code Playgroud)

家.dart

import ..provider_type.dart
...
    Widget build(BuildContext context){
        return ChangeNotifierProvider<ProviderType>(
            create: (context) => ProviderType(),
            child: ScreenColumn();
        );
    }
...
Run Code Online (Sandbox Code Playgroud)

screen_column.dart

import ..screen_a.dart
import ..screen_b.dart
class ScreenColumn extends StatelessWidget{
    Widget build(BuildContext context){
        var providerType = Provider.of<ProviderType>(context);

        return Column(
            children: <Widget>[
                ScreenA(providerType: providerType),
                ScreenB(providerType: providerType),
            ],
        );
    }
} …
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-provider

3
推荐指数
1
解决办法
3637
查看次数

标签 统计

flutter ×2

dart ×1

flutter-provider ×1