Flutter 如何在子窗口小部件上编辑值

Flutter 如何在子窗口小部件上编辑值,flutter,dart,Flutter,Dart,我尝试编辑子窗口小部件的值,我可以使用StatefulWidget parent进行编辑,但我希望使用无状态窗口小部件parent进行编辑,而不使用全局值 class Homepage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( actions: <Widget>[

我尝试编辑子窗口小部件的值,我可以使用StatefulWidget parent进行编辑,但我希望使用无状态窗口小部件parent进行编辑,而不使用全局值

    class Homepage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: <Widget>[
          FlatButton(child: Text('addFile'), onPressed: () {}),
          FlatButton(child: Text('deleteFile'), onPressed: () {})
        ],
      ),
      body: Child(),
    );
  }
}

class Child extends StatefulWidget {
  @override
  _ChildState createState() => _ChildState();
}

class _ChildState extends State<Child> {
  var hasFile = true;
  @override
  Widget build(BuildContext context) {
    return hasFile ? Text('has a file') : Text("no File");
  }
}
类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
行动:[
FlatButton(子项:Text('addFile'),按下时:(){}),
FlatButton(子项:Text('deleteFile'),按下时:(){})
],
),
正文:Child(),
);
}
}
类子级扩展StatefulWidget{
@凌驾
_ChildState createState()=>\u ChildState();
}
类_ChildState扩展了状态{
var hasFile=true;
@凌驾
小部件构建(构建上下文){
return hasFile?Text(“有文件”):Text(“没有文件”);
}
}

您可以使用BLoC模式来实现这种功能

下面是处理bool状态的BLoC类

import 'dart:async';

class Bloc {
  final _fileController = StreamController<bool>();

  changeState(bool val) {
    _fileController.sink.add(val);
  }

  get hasFile => _fileController.stream;

  dispose() {
    _fileController.close();
  }
}

final bloc = Bloc();
导入'dart:async';
阶级集团{
final _fileController=StreamController();
变更状态(布尔值){
_fileController.sink.add(val);
}
获取hasFile=>\u fileController.stream;
处置{
_fileController.close();
}
}
最终集团=集团();
然后,您可以在有状态小部件中添加流生成器,您将在其中提供streamofbloc类。 StreamBuilder根据流更新其UI

class Child extends StatefulWidget {
  @override
  _ChildState createState() => _ChildState();
}

class _ChildState extends State<Child> {
  var hasFile = true;

  @override
  void dispose() {
    bloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: bloc.hasFile,
      initialData: false,
      builder: (context, snapshot) {
        return snapshot.data ? Text('has a file') : Text("no File");
      },
    );
  }
}
类子级扩展StatefulWidget{
@凌驾
_ChildState createState()=>\u ChildState();
}
类_ChildState扩展了状态{
var hasFile=true;
@凌驾
无效处置(){
集团处置();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:bloc.hasFile,
initialData:false,
生成器:(上下文,快照){
return snapshot.data?Text('has a file'):Text(“no file”);
},
);
}
}
最后,您可以使用无状态小部件访问BLoC类,如下所示

class Homepage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: <Widget>[
          FlatButton(
              child: Text('addFile'),
              onPressed: () {
                bloc.changeState(true);
              }),
          FlatButton(
              child: Text('deleteFile'),
              onPressed: () {
                bloc.changeState(false);
              })
        ],
      ),
      body: Child(),
    );
  }
}
类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
行动:[
扁平按钮(
子项:文本('addFile'),
已按下:(){
集团变更状态(真);
}),
扁平按钮(
子项:文本('deleteFile'),
已按下:(){
集团变更状态(错误);
})
],
),
正文:Child(),
);
}
}
完整示例如下所示

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Homepage(),
    );
  }
}

class Homepage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: <Widget>[
          FlatButton(
              child: Text('addFile'),
              onPressed: () {
                bloc.changeState(true);
              }),
          FlatButton(
              child: Text('deleteFile'),
              onPressed: () {
                bloc.changeState(false);
              })
        ],
      ),
      body: Child(),
    );
  }
}

class Child extends StatefulWidget {
  @override
  _ChildState createState() => _ChildState();
}

class _ChildState extends State<Child> {
  var hasFile = true;

  @override
  void dispose() {
    bloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: bloc.hasFile,
      initialData: false,
      builder: (context, snapshot) {
        return snapshot.data ? Text('has a file') : Text("no File");
      },
    );
  }
}

class Bloc {
  final _fileController = StreamController<bool>();

  changeState(bool val) {
    _fileController.sink.add(val);
  }

  get hasFile => _fileController.stream;

  dispose() {
    _fileController.close();
  }
}

final bloc = Bloc();
导入“包装:颤振/材料.省道”;
导入“dart:async”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:主页(),
);
}
}
类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
行动:[
扁平按钮(
子项:文本('addFile'),
已按下:(){
集团变更状态(真);
}),
扁平按钮(
子项:文本('deleteFile'),
已按下:(){
集团变更状态(错误);
})
],
),
正文:Child(),
);
}
}
类子级扩展StatefulWidget{
@凌驾
_ChildState createState()=>\u ChildState();
}
类_ChildState扩展了状态{
var hasFile=true;
@凌驾
无效处置(){
集团处置();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:bloc.hasFile,
initialData:false,
生成器:(上下文,快照){
return snapshot.data?Text('has a file'):Text(“no file”);
},
);
}
}
阶级集团{
final _fileController=StreamController();
变更状态(布尔值){
_fileController.sink.add(val);
}
获取hasFile=>\u fileController.stream;
处置{
_fileController.close();
}
}
最终集团=集团();

您可以使用BLoC模式来实现这种功能

下面是处理bool状态的BLoC类

import 'dart:async';

class Bloc {
  final _fileController = StreamController<bool>();

  changeState(bool val) {
    _fileController.sink.add(val);
  }

  get hasFile => _fileController.stream;

  dispose() {
    _fileController.close();
  }
}

final bloc = Bloc();
导入'dart:async';
阶级集团{
final _fileController=StreamController();
变更状态(布尔值){
_fileController.sink.add(val);
}
获取hasFile=>\u fileController.stream;
处置{
_fileController.close();
}
}
最终集团=集团();
然后,您可以在有状态小部件中添加流生成器,您将在其中提供streamofbloc类。 StreamBuilder根据流更新其UI

class Child extends StatefulWidget {
  @override
  _ChildState createState() => _ChildState();
}

class _ChildState extends State<Child> {
  var hasFile = true;

  @override
  void dispose() {
    bloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: bloc.hasFile,
      initialData: false,
      builder: (context, snapshot) {
        return snapshot.data ? Text('has a file') : Text("no File");
      },
    );
  }
}
类子级扩展StatefulWidget{
@凌驾
_ChildState createState()=>\u ChildState();
}
类_ChildState扩展了状态{
var hasFile=true;
@凌驾
无效处置(){
集团处置();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:bloc.hasFile,
initialData:false,
生成器:(上下文,快照){
return snapshot.data?Text('has a file'):Text(“no file”);
},
);
}
}
最后,您可以使用无状态小部件访问BLoC类,如下所示

class Homepage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: <Widget>[
          FlatButton(
              child: Text('addFile'),
              onPressed: () {
                bloc.changeState(true);
              }),
          FlatButton(
              child: Text('deleteFile'),
              onPressed: () {
                bloc.changeState(false);
              })
        ],
      ),
      body: Child(),
    );
  }
}
类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
行动:[
扁平按钮(
子项:文本('addFile'),
已按下:(){
集团变更状态(真);
}),
扁平按钮(
子项:文本('deleteFile'),
已按下:(){
集团变更状态(错误);
})
],
),
正文:Child(),
);
}
}
完整示例如下所示

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Homepage(),
    );
  }
}

class Homepage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: <Widget>[
          FlatButton(
              child: Text('addFile'),
              onPressed: () {
                bloc.changeState(true);
              }),
          FlatButton(
              child: Text('deleteFile'),
              onPressed: () {
                bloc.changeState(false);
              })
        ],
      ),
      body: Child(),
    );
  }
}

class Child extends StatefulWidget {
  @override
  _ChildState createState() => _ChildState();
}

class _ChildState extends State<Child> {
  var hasFile = true;

  @override
  void dispose() {
    bloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: bloc.hasFile,
      initialData: false,
      builder: (context, snapshot) {
        return snapshot.data ? Text('has a file') : Text("no File");
      },
    );
  }
}

class Bloc {
  final _fileController = StreamController<bool>();

  changeState(bool val) {
    _fileController.sink.add(val);
  }

  get hasFile => _fileController.stream;

  dispose() {
    _fileController.close();
  }
}

final bloc = Bloc();
导入“包装:颤振/材料.省道”;
导入“dart:async”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(BuildContext)