lang_sort_bottom_sheet.dart 3.83 KB
import 'package:flutter/material.dart';
import 'package:Parlando/poem/provider/lang_sort_provider.dart';
import 'package:Parlando/res/resources.dart';
import 'package:Parlando/routers/fluro_navigator.dart';
import 'package:provider/provider.dart';
import 'package:Parlando/util/screen_utils.dart';

class LangSortBottomSheet extends StatefulWidget {
  const LangSortBottomSheet({
    Key? key,
    required this.provider,
    required this.onSelected,
  }) : super(key: key);

  final Function(String, String) onSelected;

  /// 临时状态
  final LangSortProvider provider;

  @override
  LangSortBottomSheetState createState() => LangSortBottomSheetState();
}

class LangSortBottomSheetState extends State<LangSortBottomSheet>
    with SingleTickerProviderStateMixin {
  final ScrollController _controller = ScrollController();

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      widget.provider.initData();
    });
  }

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

  @override
  Widget build(BuildContext context) {
    return Material(
      child: SizedBox(
        height: context.height * 11.0 / 16.0,

        /// 为保留状态,选择ChangeNotifierProvider.value,销毁自己手动处理(见 goods_edit_page.dart :dispose())
        child: ChangeNotifierProvider<LangSortProvider>.value(
          value: widget.provider,
          child: Consumer<LangSortProvider>(
            builder: (_, provider, child) {
              return Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  child!,
                  Gaps.line,
                  Expanded(
                    child: ListView.builder(
                      controller: _controller,
                      itemExtent: 48.0,
                      itemBuilder: (_, index) {
                        return _buildItem(provider, index);
                      },
                      itemCount: provider.mList.length,
                    ),
                  )
                ],
              );
            },
            child: Stack(
              children: <Widget>[
                Container(
                  width: double.infinity,
                  alignment: Alignment.center,
                  padding: const EdgeInsets.symmetric(vertical: 16.0),
                  child: const Text(
                    '请选择口音',
                    style: TextStyles.textBold16,
                  ),
                ),
                Positioned(
                  right: 16.0,
                  top: 16.0,
                  bottom: 16.0,
                  child: InkWell(
                    onTap: () => NavigatorUtils.goBack(context),
                    child: const SizedBox(
                      height: 16.0,
                      width: 16.0,
                      child: Icon(Icons.close),
                    ),
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }

  Widget _buildItem(LangSortProvider provider, int index) {
    return InkWell(
      child: Container(
        padding: const EdgeInsets.symmetric(horizontal: 16.0),
        alignment: Alignment.centerLeft,
        child: Row(
          children: <Widget>[
            Text(
              provider.mList[index].name!,
              style: const TextStyle(
                fontSize: Dimens.font_sp14,
                color: Colors.black45,
              ),
            ),
          ],
        ),
      ),
      onTap: () {
        widget.onSelected(
            provider.mList[index].id!, provider.mList[index].name!);
        NavigatorUtils.goBack(context);
        _controller.animateTo(
          0.0,
          duration: const Duration(milliseconds: 100),
          curve: Curves.ease,
        );
      },
    );
  }
}