ValueNotifier<T> ValueListenableBuilder<T> Stack() positioned.fill()

发布时间 2023-07-24 14:09:13作者: hztech

 

1、在Column下面增加可以滚动的Row

2、在widget外部控件其内部的变量 ValueNotifier<T>  ValueListenableBuilder<T>(valueListenable:...,builder:()=>)

 

 

import 'package:flutter/material.dart';

class SettingsPage extends StatelessWidget {
  final int _counter = 0;
  late CountController ccon = CountController();
  SettingsPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Settings'),
      ),
      body: Center(
          child: Column(
        children: <Widget>[
          Stack(
            children: [
              const IgnorePointer(
                //忽略点击事件
                child: Opacity(
                  //隐藏这个widget
                  opacity: 0.0, //隐藏这个widget
                  child: Item(), //stack 下面的非positioned的元素确定高度
                ),
              ),
              const SizedBox(
                width: double.infinity, //stack 下面的非positioned的元素确定宽度
              ),
              Positioned.fill(
                  child: ListView.builder(
                //shrinkWrap: true,
                scrollDirection: Axis.horizontal,
                itemBuilder: (context, index) => Item(),
              )),
            ],
          ),
          const SizedBox(
            height: 50,
          ),
          const Expanded(
              flex: 1,
              child: SizedBox(
                child: Text(
                  '以下是跨widget共享变量的测试',
                  style: TextStyle(fontSize: 30),
                ),
              )),
          Expanded(
            flex: 2,
            child: SizedBox(
                child: Counter(
              controller: ccon,
            )),
          )
        ],
       
      )),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          ccon._count.value = 0;
        },
        child: Icon(Icons.clear),
      ),
    );
  }
}
//card widget自定义
class Item extends StatelessWidget {
  const Item({super.key});

  @override
  Widget build(BuildContext context) {
    return Card(
      child: Column(children: [
        Text(
          'hello',
          style: TextStyle(fontSize: 32),
        ),
        Text(
          'world',
          style: TextStyle(fontSize: 47),
        )
      ]),
    );
  }
}

// 变量ValueNotifier<T> 被  ValueListenableBuilder<int> 监听 
class Counter extends StatefulWidget {
  final CountController controller;
  const Counter({super.key, required this.controller});

  @override
  State<Counter> createState() => _CounterState();
}

class _CounterState extends State<Counter> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: ValueListenableBuilder<int>(
          valueListenable: widget.controller._count,
          builder: (context, value, _) {
            return Center(
              child: ListView(
                padding: EdgeInsets.all(30),
                children: [
                  Center(
                      child: Text(
                    'Value is $value',
                    style: TextStyle(
                      fontSize: 50,
                    ),
                  )),
                  ElevatedButton(
                      onPressed: () {
                        widget.controller._count.value++;
                      },
                      child: Text('button ${widget.controller._count.value}'))
                ],
              ),
            );
          }),
    );

    
  }
}

class CountController {
   

  ValueNotifier<int> _count = ValueNotifier(0);
}